Compare commits

...
25 Commits
Author SHA1 Message Date
Hivert Quentin b864c55a8a feat(openID): second part with a lot of fixes and cleaning 2025-03-13 15:24:53 +01:00
Hivert Quentin 9017c85581 squashed 2025-03-10 09:29:41 +01:00
Hivert Quentin 5cba10ccff fix(totp): correctly send a string and leading zero 2025-03-07 09:03:41 +01:00
André Rodier b48704e7ff Update SOGoRootPage.wox
Ensure the TOTP input field only accept number, so it is quicker to type on mobile devices.
Disable history of the TOTP input, which is not necessary.

See https://bugs.sogo.nu//view.php?id=5524
2025-03-04 14:10:03 +01:00
Hivert Quentin 69116d8eb7 fix(core): don't show link if SOGoURLCreateAccount is set but empty 2025-02-26 14:20:28 +01:00
Hivert Quentin d15f0ee804 fix(calendar): properly store the vevent is the correct order for reccurence and reccurence-id 2025-02-19 16:14:34 +01:00
Hivert Quentin a1e8a5c4af Revert "fix(calendar): Flatten cycle change: the day at 00:00 is now used to retrieve all occurrences. This change should resolve the issue where resource availability is not detected if the event is shorter than the occurrence duration in the resource."
This reverts commit 9941e2a04b.
2025-02-17 16:49:42 +01:00
y9048a 02dd5c3501 feat(mail) Introduce option SOGoVacationAllowZeroDays to allow a sieve vacation days value of 0 2025-02-11 17:17:58 +01:00
CLSMCSMII 7a7f85d1a7 Update UIxMailPartHTMLViewer.m For Thai charset (windows-874)
Fix bug 0006090: Web mail does not display Thai characters in emails sent from Exchange

As advised by qhivert
2025-02-11 11:20:56 +01:00
Hivert Quentin 6d4016dfdb chore(js/css): update generated files 2025-02-05 01:00:37 -05:00
Hivert Quentin e06a0d2035 chore(htmlViewer): remove space between lines 2025-02-04 15:29:36 +01:00
Hivert Quentin f8ff98b657 fix(htmlViewer): if the the tag img is not a url but a base64 image, keep it in the preview 2025-02-04 15:28:19 +01:00
Hivert Quentin 512f14f6d0 chore(js/css): update generated files 2025-02-04 01:00:39 -05:00
Hivert Quentin 9f4f48a44f feat(calendar): Can defined the Jitsi server url for meeting created 2025-02-03 14:19:02 +01:00
Hivert Quentin 092e7694e0 chore(js/css): update generated files 2025-01-28 01:00:36 -05:00
Hivert Quentin 42c227beca feat(calendar): Can now create Jitsi link when making event 2025-01-27 14:27:09 +01:00
Hivert Quentin c400f45ef1 chore(js/css): update generated files 2025-01-23 01:00:36 -05:00
Hivert Quentin 78655ae127 fix(users): try to always use the user domain in the basDN with %d 2025-01-22 16:16:47 +01:00
Hivert Quentin 29e00f3e9e fix(users): don't look up for users when they change language on root page 2025-01-22 16:16:47 +01:00
Hivert Quentin beb0d9cb1b fix(users): when using multi-domains configuration, only request the apopriate usersources. 2025-01-22 16:16:47 +01:00
Hivert Quentin 5c1278a895 chore(js/css): update generated files 2025-01-18 01:00:37 -05:00
smizrahi 616c9291e0 chore(ckeditor): Update to CKEditor 44.1.0 2025-01-17 10:58:37 +01:00
smizrahi 9941e2a04b fix(calendar): Flatten cycle change: the day at 00:00 is now used to retrieve all occurrences. This change should resolve the issue where resource availability is not detected if the event is shorter than the occurrence duration in the resource. 2025-01-07 18:39:02 +01:00
smizrahi b40d777a86 fix(mail): Fix error when searching string with quote 2024-12-23 15:35:19 +01:00
smizrahi 70f72eb92f fix(mail): Fix ckeditor issue where the font-size disappear after mail sent. Use font-size instead of css class. 2024-12-23 11:18:28 +01:00
149 changed files with 11604 additions and 556 deletions

No files matched your search

+118 -4
View File
@@ -437,8 +437,8 @@ Defaults to `300`.
|S |SOGoAuthenticationType
|Parameter used to define the way by which users will be authenticated.
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For anything
else, leave that value empty.
For C.A.S., specify `cas`. For SAML2, specify `saml2`. For opendID Connect, specify `openid`.
For anything else, leave that value empty.
|S |SOGoTrustProxyAuthentication
|Parameter used to set whether HTTP username should be trusted.
@@ -477,6 +477,19 @@ example.
Defaults to `YES` when unset.
|S |SOGoCalendarEnableJitsiLink
|Parameter allowing users to create Jitsi link when creating an event.
Be aware that a least one of the attendees will need an account from a
platform that Jitsi supports: Google, Facebook or Github
Defaults to `NO` when unset.
|D |SOGoCalendarJitsiBaseUrl
|Only used if SOGoCalendarEnableJitsiLink is set to YES. String for the URL of
the jitsi server used for creating the meeting link.
Defaults to `https://meet.jit.si` when unset.
|S |SOGoSAML2PrivateKeyLocation
|The location of the SSL private key file on the filesystem that is used
by SOGo to sign and encrypt communications with the SAML2 identity
@@ -1546,6 +1559,81 @@ SOGoIMAPCASServiceName should be set to the actual imap service name
expected by pam_cas, otherwise it will fail to authenticate incoming
connection properly.
Authenticating using OPENID
~~~~~~~~~~~~~~~~~~~~~~~~~~~
SOGo natively supports OPENID authentication. For activating OpenId authentication you need first to make sure that
_SOGoAuthenticationType_ is set to `openid`,
_SOGoXSRFValidationEnabled_ is set to `NO` and set the following parameters:
[cols="^4,46,50a"]
|=======================================================================
|S |OCSOpenIdURL
|Parameter used to set the database URL for openID session.
For MariaDB/MySQL, set the database URL to something like: mysql://sogo:sogo@127.0.0.1:3306/sogo/sogo_openid.
|S |SOGoOpenIdConfigUrl
|Parameter used to specify the endpoint of OpenID Provider Configuration, mandatory. For example:
https://myopenid.net/.well-known/openid-configuration
|S |SOGoOpenIdClient
|Name of your openid client, mandatory.
|S |SOGoOpenIdClientSecret
|Secret of your openid client, mandatory
|S |SOGoOpenIdScope
|Scope or your openid client, mandatory. List of words space separated like this:
"openid profile email"
|S |SOGoOpenIdEmailParam
|Name of the parameter from user profile that contains the mail/uid.
Defaults to `email` when unset.
|S |SOGoOpenIdEnableRefreshToken
|Set to `YES` to Enable the mechanism of refresh token if provided. You may have to configure
and/or add a value to your scope for it to work.
Defaults to `NO` when unset.
|S |SOGoOpenIdTokenCheckInterval
|Number of seconds before sogo check again the user's access token validity.
This is to prevent sogo to do too much request to the openid server.
Defaults to `0` when unset.
|S |SOGoOpenIdLogoutEnabled
|Allow user to end their openId with the webmail. Meaning that will disconnect them from
the others applicaitons as well.
Defaults to `NO` when unset.
|=======================================================================
The tricky part shows up for the imap and smtp sever. SOGo doesn't know the password
of the user and only have its access token. A new auth mechanism has been implemented,
the https://developers.google.com/gmail/imap/xoauth2-protocol#initial_client_response[xoauth2]
You can set it with the parameter _NGImap4AuthMechanism_ and/or _SOGoSMTPAuthenticationType_
*With dovecot:* +
Dovecot natively supports xoauth2 and can be figured as such: https://doc.dovecot.org/2.3/configuration_manual/authentication/oauth2/
*With cyrus:* +
Cyrus doesn't support xoauth2 mechanism and pluggins or homemade solutions must be found. +
_Please note, as Alinto uses dovecot, we didn't investigate cyrus' case. If one member of the community
finds a solution, we will be happy to update this documentation._
As you can see, a new database table is used for handling openid session. The table is automaticcaly created when _OCSOpenIdURL_ is set.
If the user quits the webmail without logging out or trough another application,
the session will stays in the table and be useless. That's why a new sogo-tool command has been added to clean this table.
You can put it in a cron to do that periodicly. +
See _<<sogo-tool-clean-openid-sessions,sogo-tool clean-openid-sessions>>_.
Authenticating using SAML2
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2100,8 +2188,7 @@ To disable TLS verification for localhost domains, add
|D |SOGoSMTPAuthenticationType
|Activate SMTP authentication and specifies which type is in use.
Current, only `PLAIN` is supported and other values will cause
the authentication to fail.
Current, Are supported `PLAIN` and 'xoauth2' for openid.
|D |SOGoSMTPMasterUserEnabled
|Enable specific SMTP user account for system e-mails (notifications, reminders, ...). Default is `NO`.
@@ -2284,6 +2371,7 @@ SASL mechanism. Using `AUTHENTICATE` instead of `LOGIN` is also necessary
to enable UTF-8 characters in users' passwords. To enable simple use of
`AUTHENTICATE` for this purpose, set this setting to `plain`. Please note
that this feature might be limited at this time.
Now support `xoauth2` mechanism when using openid. Be sure you imap server undesrtands this mechanism.
|D |NGImap4ConnectionGroupIdPrefix
|Prefix to prepend to names in IMAP ACL transactions, to indicate the
@@ -2430,6 +2518,16 @@ appended to the user's vacation message. For example:
See `SOGoVacationHeaderTemplateFile` for available template variables.
|D |SOGoVacationAllowZeroDays
|Parameter used to enable an option of 0 for the vacation days setting.
A value of 0 means that auto response mails are sent for every incoming mail.
This option has to be supported by the IMAP host
(see https://doc.dovecot.org/2.3/settings/pigeonhole-ext/vacation/#pigeonhole_setting-sieve_vacation_min_period
for instructions regarding Dovecot/Pigeonhole).
Defaults to `NO` when unset.
|D |SOGoForwardEnabled
|Parameter used to activate the edition from the preferences window of a
forwarding email address. Requires Sieve script support on the IMAP
@@ -3607,6 +3705,22 @@ sogo-tool checkup user1
sogo-tool checkup -d user1
----
[[sogo-tool-clean-openid-sessions]]
sogo-tool clean-openid-sessions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Obviously only usefull if you have set SOGo with openId authentication.
Will clean all expired openId sessions from the database.
sogo-tool clean-openid-sessions
Example:
----
sogo-tool clean-openid-sessions
----
sogo-tool cleanup
~~~~~~~~~~~~~~~~~
+21 -13
View File
@@ -288,16 +288,16 @@ static BOOL debugLeaks;
e = [urlStrings objectEnumerator];
while (ok && (tmp = [e nextObject]))
{
value = [defaults stringForKey: tmp];
if (value)
[self _checkTableWithCM: cm tableURL: value andType: tmp];
else
{
value = [defaults stringForKey: tmp];
if (value)
[self _checkTableWithCM: cm tableURL: value andType: tmp];
else
{
[self errorWithFormat: @"No value specified for '%@'", tmp];
ok = NO;
}
[self errorWithFormat: @"No value specified for '%@'", tmp];
ok = NO;
}
}
if (combined)
{
@@ -322,9 +322,15 @@ static BOOL debugLeaks;
// Create the email alarms table, if required
if ([defaults enableEMailAlarms])
{
[[fm alarmsFolder] createFolderIfNotExists];
}
{
[[fm alarmsFolder] createFolderIfNotExists];
}
//Create mandatory openId table, if used
if([defaults hasOpenIdType])
{
[[fm openIdFolder] createFolderIfNotExists];
}
}
return ok;
@@ -374,8 +380,10 @@ static BOOL debugLeaks;
request = [_ctx request];
login = [SOGoUser getDecryptedUsernameIfNeeded: _key request: request];
user = [SOGoUser userWithLogin: login roles: nil];
if([login isEqualToString: @"changeLanguage"])
user = nil;
else
user = [SOGoUser userWithLogin: login roles: nil];
if (user)
userFolder = [$(@"SOGoUserFolder") objectWithName: login
inContainer: self];
+4 -1
View File
@@ -31,7 +31,7 @@
*/
@class NSString, NSArray, NSURL, NSDictionary, NSException;
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder;
@class GCSChannelManager, GCSAlarmsFolder, GCSAdminFolder, GCSFolder, GCSFolderType, GCSSessionsFolder, GCSOpenIdFolder;
@interface GCSFolderManager : NSObject
{
@@ -92,6 +92,9 @@
/* admin */
- (GCSAdminFolder *)adminFolder;
/* openid */
- (GCSOpenIdFolder *) openIdFolder;
/* folder types */
- (GCSFolderType *)folderTypeWithName:(NSString *)_name;
+7
View File
@@ -38,6 +38,7 @@
#import "EOAdaptorChannel+GCS.h"
#import "GCSAlarmsFolder.h"
#import "GCSAdminFolder.h"
#import "GCSOpenIdFolder.h"
#import "GCSFolder.h"
#import "GCSFolderType.h"
#import "GCSSessionsFolder.h"
@@ -504,6 +505,12 @@ static BOOL _singleStoreMode = NO;
return [GCSAdminFolder adminFolderWithFolderManager: self];
}
/* openId */
- (GCSOpenIdFolder *) openIdFolder
{
return [GCSOpenIdFolder openIdFolderWithFolderManager: self];
}
- (NSString *)generateSQLWhereForInternalNames:(NSArray *)_names
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
{
+57
View File
@@ -0,0 +1,57 @@
/* GCSAdminFolder.h - this file is part of $PROJECT_NAME_HERE$
*
* Copyright (C) 2023 Alinto
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef GCSOPENIDFOLDER_H
#define GCSOPENIDOLDER_H
@class NSCalendarDate;
@class NSException;
@class NSNumber;
@class NSString;
@class GCSFolderManager;
@interface GCSOpenIdFolder : NSObject
{
GCSFolderManager *folderManager;
}
+ (id)openIdFolderWithFolderManager:(GCSFolderManager *)newFolderManager;
- (void) setFolderManager: (GCSFolderManager *) newFolderManager;
/* operations */
- (void) createFolderIfNotExists;
- (BOOL) canConnectStore;
- (NSString *) getRefreshToken: (NSString *) _user_session useOldSession: (BOOL) use_old_session;
- (NSString *) getNewToken: (NSString *) _old_session;
- (NSException *) writeOpenIdSession: (NSString *) _user_session
withOldSession: (NSString *) _old_session
withRefreshToken: (NSString *) _refresh_token
withExpire: (NSNumber *) _expire
withRefreshExpire: (NSNumber *) _refresh_expire;
- (NSException *) deleteOpenIdSessionFor: (NSString *) _user_session;
@end
#endif /* GCSALARMSFOLDER_H */
+363
View File
@@ -0,0 +1,363 @@
/* GCSAdminFolder.m - this file is part of SOGo
*
* Copyright (C) 2023 Alinto
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSNull+misc.h>
#import <GDLAccess/EOAdaptorContext.h>
#import <GDLAccess/EOAttribute.h>
#import <GDLAccess/EOEntity.h>
#import <GDLAccess/EOSQLQualifier.h>
#import "EOQualifier+GCS.h"
#import "GCSChannelManager.h"
#import "GCSFolderManager.h"
#import "GCSSpecialQueries.h"
#import "NSURL+GCS.h"
#import "GCSOpenIdFolder.h"
static NSString *openIdFolderURLString = nil;
#warning GCSOpenIdFolder should share a common ancestor with GCSFolder
@implementation GCSOpenIdFolder
+ (void) initialize
{
NSUserDefaults *ud;
if (!openIdFolderURLString)
{
ud = [NSUserDefaults standardUserDefaults];
ASSIGN (openIdFolderURLString, [ud stringForKey: @"OCSOpenIdURL"]);
}
}
+ (id) openIdFolderWithFolderManager: (GCSFolderManager *) newFolderManager
{
GCSOpenIdFolder *newFolder;
if (openIdFolderURLString)
{
newFolder = [self new];
[newFolder autorelease];
[newFolder setFolderManager: newFolderManager];
}
else
{
[self errorWithFormat: @"'OCSOpenIdURL' is not set"];
newFolder = nil;
}
return newFolder;
}
- (void) setFolderManager: (GCSFolderManager *) newFolderManager
{
ASSIGN (folderManager, newFolderManager);
}
/* accessors */
- (NSURL *) _location
{
NSURL *location;
if (openIdFolderURLString)
location = [NSURL URLWithString: openIdFolderURLString];
else
{
[self warnWithFormat: @"'OCSOpenIdURL' is not set"];
location = nil;
}
return location;
}
- (GCSChannelManager *) _channelManager
{
return [folderManager channelManager];
}
- (NSString *) _storeTableName
{
return [[self _location] gcsTableName];
}
- (EOEntity *) _storeTableEntityForChannel: (EOAdaptorChannel *) tc
{
static EOEntity *entity = nil;
EOAttribute *attribute;
NSString *tableName;
NSString *columns[] = {@"c_user_session", @"c_old_session", @"c_session_started", @"c_refresh_token", @"c_access_token_expires_in", @"c_refresh_token_expires_in", nil };
NSString **column;
NSMutableArray *keys;
NSDictionary *types;
if (!entity)
{
entity = [EOEntity new];
tableName = [self _storeTableName];
[entity setName: tableName];
[entity setExternalName: tableName];
types = [[tc specialQueries] openIdAttributeTypes];
column = columns;
while (*column)
{
attribute = [EOAttribute new];
[attribute setName: *column];
[attribute setColumnName: *column];
[attribute setExternalType: [types objectForKey: *column]];
[entity addAttribute: attribute];
[attribute release];
column++;
}
keys = [NSMutableArray arrayWithCapacity: 1];
[keys addObject: [entity attributeNamed: @"c_user_session"]];
[entity setPrimaryKeyAttributes: keys];
keys = [NSMutableArray arrayWithCapacity: 5];
[keys addObject: [entity attributeNamed: @"c_old_session"]];
[keys addObject: [entity attributeNamed: @"c_session_started"]];
[keys addObject: [entity attributeNamed: @"c_refresh_token"]];
[keys addObject: [entity attributeNamed: @"c_access_token_expires_in"]];
[keys addObject: [entity attributeNamed: @"c_refresh_token_expires_in"]];
[entity setClassProperties: keys];
[entity setAttributesUsedForLocking: [NSArray array]];
}
return entity;
}
/* connection */
- (EOAdaptorChannel *) _acquireStoreChannel
{
return [[self _channelManager] acquireOpenChannelForURL: [self _location]];
}
- (void) _releaseChannel: (EOAdaptorChannel *) _channel
{
[[self _channelManager] releaseChannel:_channel immediately: YES];
}
- (BOOL) canConnectStore
{
return [[self _channelManager] canConnect:[self _location]];
}
- (void) createFolderIfNotExists
{
EOAdaptorChannel *tc;
NSString *sql, *tableName;
GCSSpecialQueries *queries;
tc = [self _acquireStoreChannel];
tableName = [self _storeTableName];
queries = [tc specialQueries];
sql = [NSString stringWithFormat: @"SELECT 1 FROM %@ WHERE 1 = 2", tableName];
if ([tc evaluateExpressionX: sql])
{
sql = [queries createOpenIdFolderWithName: tableName];
if (![tc evaluateExpressionX: sql])
[self logWithFormat: @"openid folder table '%@' successfully created!", tableName];
}
else
[tc cancelFetch];
[self _releaseChannel: tc];
}
/* operations */
/* table has the following fields:
c_user_session varchar(255) NOT NULL,
c_session_started int(11) NOT NULL,
c_refresh_token varchar(4096) DEFAULT '',
c_access_token_expires_in int(11) NOT NULL,
c_refresh_token_expires_in int(11) DEFAULT NULL,
*/
- (NSDictionary *) recordForSession: (NSString *) _user_session useOldSession: (BOOL) use_old_session
{
EOAdaptorChannel *tc;
EOAdaptorContext *context;
NSException *error;
NSArray *attrs;
NSDictionary *record;
EOEntity *entity;
EOSQLQualifier *qualifier;
record = nil;
tc = [self _acquireStoreChannel];
if (tc)
{
context = [tc adaptorContext];
entity = [self _storeTableEntityForChannel: tc];
if(!use_old_session)
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
qualifierFormat: @"c_user_session='%@'", _user_session];
else
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
qualifierFormat: @"c_old_session='%@'", _user_session];
[qualifier autorelease];
[context beginTransaction];
error = [tc selectAttributesX: [entity attributesUsedForFetch]
describedByQualifier: qualifier
fetchOrder: nil
lock: NO];
if (error)
[self errorWithFormat:@"%s: cannot execute fetch: %@", __PRETTY_FUNCTION__, error];
else
{
attrs = [tc describeResults: NO];
record = [tc fetchAttributes: attrs withZone: NULL];
[tc cancelFetch];
}
[context rollbackTransaction];
[self _releaseChannel: tc];
}
return record;
}
- (NSString *) getRefreshToken: (NSString *) _user_session
{
NSDictionary *r;
r = [self recordForSession: _user_session useOldSession: NO];
if (r && [r objectForKey:@"c_refresh_token"])
return [r objectForKey:@"c_refresh_token"];
return nil;
}
- (NSString *) getNewToken: (NSString *) _old_session
{
NSDictionary *r;
r = [self recordForSession: _old_session useOldSession: YES];
if (r && [r objectForKey:@"c_user_session"])
return [r objectForKey:@"c_user_session"];
return nil;
}
- (NSException *) writeOpenIdSession: (NSString *) _user_session
withOldSession: (NSString *) _old_session
withRefreshToken: (NSString *) _refresh_token
withExpire: (NSNumber *) _expire
withRefreshExpire: (NSNumber *) _refresh_expire
{
NSDictionary *record, *newRecord;
NSException *error;
NSCalendarDate *nowDate;
int now, nowExpire, nowRefreshExpire;
EOAdaptorChannel *tc;
EOAdaptorContext *context;
EOEntity *entity;
EOSQLQualifier *qualifier;
error = nil;
tc = [self _acquireStoreChannel];
if (tc)
{
context = [tc adaptorContext];
nowDate = [NSCalendarDate date];
now = (nowDate ? (int)[nowDate timeIntervalSince1970] : 0);
nowExpire = now + [_expire intValue];
if(_refresh_expire)
nowRefreshExpire = now + [_refresh_expire intValue];
else
nowRefreshExpire = -1;
if(!_old_session)
_old_session = @"";
newRecord = [NSDictionary dictionaryWithObjectsAndKeys: _user_session, @"c_user_session",
_old_session, @"c_old_session",
[NSNumber numberWithInt:now], @"c_session_started",
_refresh_token, @"c_refresh_token",
[NSNumber numberWithInt:nowExpire] , @"c_access_token_expires_in",
[NSNumber numberWithInt:nowRefreshExpire] , @"c_refresh_token_expires_in",
nil];
record = [self recordForSession: _user_session useOldSession: NO];
entity = [self _storeTableEntityForChannel: tc];
[context beginTransaction];
if (!record)
{
//If the session already exist no need to update it as it is unique
error = [tc insertRowX: newRecord forEntity: entity];
}
if (error)
{
[context rollbackTransaction];
[self errorWithFormat:@"%s: cannot write record: %@", __PRETTY_FUNCTION__, error];
}
else
[context commitTransaction];
[self _releaseChannel: tc];
}
return error;
}
- (NSException *) deleteOpenIdSessionFor: (NSString *) _user_session
{
EOAdaptorChannel *tc;
EOAdaptorContext *context;
EOEntity *entity;
EOSQLQualifier *qualifier;
NSException *error;
error = nil;
tc = [self _acquireStoreChannel];
if (tc)
{
context = [tc adaptorContext];
entity = [self _storeTableEntityForChannel: tc];
qualifier = [[EOSQLQualifier alloc] initWithEntity: entity
qualifierFormat: @"c_user_session='%@'",_user_session];
[qualifier autorelease];
[context beginTransaction];
error = [tc deleteRowsDescribedByQualifierX: qualifier];
if (error)
{
[context rollbackTransaction];
[self errorWithFormat:@"%s: cannot delete record: %@", __PRETTY_FUNCTION__, error];
}
else
[context commitTransaction];
[self _releaseChannel: tc];
}
return error;
}
@end
+3
View File
@@ -42,6 +42,9 @@
- (NSString *)createAdminFolderWithName:(NSString *)tableName;
- (NSDictionary *)adminAttributeTypes;
- (NSString *)createOpenIdFolderWithName:(NSString *)tableName;
- (NSDictionary *)openIdAttributeTypes;
- (NSString *) updateCPathInFolderInfo:(NSString *)tableName
withCPath2:(NSString *)c_path2;
+111
View File
@@ -95,6 +95,21 @@
return nil;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
[self subclassResponsibility: _cmd];
return nil;
}
- (NSDictionary *) openIdAttributeTypes
{
[self subclassResponsibility: _cmd];
return nil;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
[self subclassResponsibility: _cmd];
@@ -195,6 +210,38 @@
return types;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session VARCHAR(4096) NOT NULL,"
@" c_old_session VARCHAR(4096) NULL,"
@" c_session_started INT4 NOT NULL,"
@" c_refresh_token VARCHAR(4096) NULL,"
@" c_access_token_expires_in INT4 NOT NULL,"
@" c_refresh_token_expires_in INT4 NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
}
- (NSDictionary *) openIdAttributeTypes
{
static NSMutableDictionary *types = nil;
if (!types)
{
types = [NSMutableDictionary new];
[types setObject: @"varchar" forKey: @"c_user_session"];
[types setObject: @"varchar" forKey: @"c_old_session"];
[types setObject: @"int" forKey: @"c_session_started"];
[types setObject: @"varchar" forKey: @"c_refresh_token"];
[types setObject: @"int" forKey: @"c_access_token_expires_in"];
[types setObject: @"int" forKey: @"c_refresh_token_expires_in"];
}
return types;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
@@ -324,6 +371,38 @@
return types;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session VARCHAR(4096) NOT NULL,"
@" c_old_session VARCHAR(4096) NULL,"
@" c_session_started INT4 NOT NULL,"
@" c_refresh_token VARCHAR(4096) NULL,"
@" c_access_token_expires_in INT4 NOT NULL,"
@" c_refresh_token_expires_in INT4 NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
}
- (NSDictionary *) openIdAttributeTypes
{
static NSMutableDictionary *types = nil;
if (!types)
{
types = [NSMutableDictionary new];
[types setObject: @"varchar" forKey: @"c_user_session"];
[types setObject: @"varchar" forKey: @"c_old_session"];
[types setObject: @"int" forKey: @"c_session_started"];
[types setObject: @"varchar" forKey: @"c_refresh_token"];
[types setObject: @"int" forKey: @"c_access_token_expires_in"];
[types setObject: @"int" forKey: @"c_refresh_token_expires_in"];
}
return types;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
@@ -453,6 +532,38 @@
return types;
}
- (NSString *) createOpenIdFolderWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
= (@"CREATE TABLE %@ ("
@" c_user_session VARCHAR2(4096) NOT NULL,"
@" c_old_session VARCHAR2(4096) NULL,"
@" c_session_started INTEGER NOT NULL,"
@" c_refresh_token VARCHAR2(4096) NULL,"
@" c_access_token_expires_in INTEGER NOT NULL,"
@" c_refresh_token_expires_in INTEGER NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
}
- (NSDictionary *) openIdAttributeTypes
{
static NSMutableDictionary *types = nil;
if (!types)
{
types = [NSMutableDictionary new];
[types setObject: @"varchar2" forKey: @"c_user_session"];
[types setObject: @"varchar2" forKey: @"c_old_session"];
[types setObject: @"integer" forKey: @"c_session_started"];
[types setObject: @"varchar2" forKey: @"c_refresh_token"];
[types setObject: @"integer" forKey: @"c_access_token_expires_in"];
[types setObject: @"integer" forKey: @"c_refresh_token_expires_in"];
}
return types;
}
- (NSString *) createFolderTableWithName: (NSString *) tableName
{
static NSString *sqlFolderFormat
+6 -4
View File
@@ -28,13 +28,14 @@ libGDLContentStore_HEADER_FILES += \
GCSAdminFolder.h \
GCSContext.h \
GCSFieldInfo.h \
GCSFolder.h \
GCSFolder.h \
GCSFolderManager.h \
GCSFolderType.h \
GCSChannelManager.h \
GCSOpenIdFolder.h \
GCSSessionsFolder.h \
GCSSpecialQueries.h \
GCSStringFormatter.h \
GCSStringFormatter.h \
libGDLContentStore_OBJC_FILES += \
NSURL+GCS.m \
@@ -45,13 +46,14 @@ libGDLContentStore_OBJC_FILES += \
GCSAdminFolder.m \
GCSContext.m \
GCSFieldInfo.m \
GCSFolder.m \
GCSFolder.m \
GCSFolderManager.m \
GCSFolderType.m \
GCSChannelManager.m \
GCSOpenIdFolder.m \
GCSSessionsFolder.m \
GCSSpecialQueries.m \
GCSStringFormatter.m \
GCSStringFormatter.m \
# framework support
+10
View File
@@ -165,6 +165,16 @@ CREATE TABLE sogo_admin (
PRIMARY KEY (c_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
CREATE TABLE sogo_opend_id (
c_user_session varchar(4096) NOT NULL,
c_old_session varchar(4096) DEFAULT '',
c_session_started int(11) NOT NULL,
c_refresh_token varchar(4096) DEFAULT '',
c_access_token_expires_in int(11) NOT NULL,
c_refresh_token_expires_in int(11) DEFAULT NULL,
PRIMARY KEY (c_user_session)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
CREATE TABLE sogo_user_profile (
c_uid varchar(255) NOT NULL,
c_defaults longtext,
@@ -25,6 +25,7 @@
#import <Foundation/NSString.h>
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalDateTime.h>
#import <NGCards/iCalRepeatableEntityObject.h>
#import "iCalCalendar+SOGo.h"
@@ -97,7 +98,29 @@
elements = [self allObjects];
count = [elements count];
if (count)
{
element = [elements objectAtIndex: 0];
if(count >1)
{
//If there more than one event, it may because there is the main reccurent event and some exceptions with reccurenceId
//It's important to fetch the "main" vevent and not the other.
NSEnumerator *elementEnum;
NSCalendarDate *recurrenceId;
CardGroup *elem;
elementEnum = [elements objectEnumerator];
while((elem = [elementEnum nextObject]))
{
recurrenceId = [(iCalDateTime *) [elem uniqueChildWithTag: @"recurrence-id"] dateTime];
if(recurrenceId)
continue;
else
{
element = elem;
break;
}
}
}
}
else
{
//NSLog(@"ERROR: given calendar contains no elements: %@", self);
+24 -13
View File
@@ -132,14 +132,24 @@
- (NGImap4ConnectionManager *) mailManager
{
return [NGImap4ConnectionManager defaultConnectionManager];
SOGoSystemDefaults *sd;
NSString *imapAuthMech, *domain;
domain = [[[self context] activeUser] loginDomain];
sd = [SOGoSystemDefaults sharedSystemDefaults];
if([sd doesLoginTypeByDomain])
imapAuthMech = [sd getImapAuthMechForDomain: domain];
else
imapAuthMech = nil;
return [NGImap4ConnectionManager defaultConnectionManager: imapAuthMech];
}
- (NGImap4Connection *) _createIMAP4Connection
{
NGImap4ConnectionManager *manager;
NGImap4Connection *newConnection;
NSString *password;
NSString *password, *domain;
NGInternetSocketAddress *host;
SOGoSystemDefaults *sd;
BOOL usesSSO;
@@ -152,12 +162,15 @@
host = [NGInternetSocketAddress addressWithPort:0 onHost:[[self imap4URL] host]];
sd = [SOGoSystemDefaults sharedSystemDefaults];
usesSSO = [[sd authenticationType] isEqualToString: @"cas"] || [[sd authenticationType] isEqualToString: @"saml2"];
domain = [[[self context] activeUser] loginDomain];
usesSSO = [sd isSsoUsed: domain];
if (![[[self mailAccountFolder] nameInContainer] isEqualToString: @"0"] &&
usesSSO &&
[host isLocalhost])
{
//
[self errorWithFormat: @"Trying to use localhost for additional IMAP account - aborting."];
return nil;
}
@@ -227,19 +240,17 @@
login = [[[self context] activeUser] login];
if (!login)
login = [[[[self container] context] activeUser] login];
login = [[[[self container] context] activeUser] login];
cacheKey = [NSString stringWithFormat: @"%@+%@",
login,
[[self mailAccountFolder] nameInContainer]];
cacheKey = [NSString stringWithFormat: @"%@+%@", login, [[self mailAccountFolder] nameInContainer]];
imap4 = [sogoCache imap4ConnectionForKey: cacheKey];
if (!imap4)
{
imap4 = [self _createIMAP4Connection];
[sogoCache registerIMAP4Connection: imap4
forKey: cacheKey];
}
[imap4 retain];
{
imap4 = [self _createIMAP4Connection];
[sogoCache registerIMAP4Connection: imap4
forKey: cacheKey];
}
[imap4 retain];
}
// Connection broken, try to reconnect
+2
View File
@@ -69,6 +69,7 @@ SOGo_HEADER_FILES = \
SOGoAuthenticator.h \
SOGoSession.h \
SOGoCASSession.h \
SOGoOpenIdSession.h \
SOGoDAVAuthenticator.h \
SOGoProxyAuthenticator.h \
SOGoStaticAuthenticator.h \
@@ -161,6 +162,7 @@ SOGo_OBJC_FILES = \
\
SOGoSession.m \
SOGoCASSession.m \
SOGoOpenIdSession.m \
SOGoDAVAuthenticator.m \
SOGoProxyAuthenticator.m \
SOGoStaticAuthenticator.m \
+1
View File
@@ -17,6 +17,7 @@ SOGo_LIBRARIES_DEPEND_UPON += \
-Wl,--no-as-needed \
-L../../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
-lmemcached \
-lcurl \
-lGDLAccess \
-lNGObjWeb \
-lNGCards \
+12 -2
View File
@@ -1429,11 +1429,22 @@ groupObjectClasses: (NSArray *) newGroupObjectClasses
NSMutableArray *contacts;
EOQualifier *qualifier;
unsigned int i;
NSMutableString *s;
NSString *sortAttribute;
BOOL sortReverse;
contacts = [NSMutableArray array];
if(theDomain != nil && [theDomain length] > 0)
{
if ([_pristineBaseDN rangeOfString: @"%d"].location != NSNotFound)
{
s = [NSMutableString stringWithString: _pristineBaseDN];
[s replaceOccurrencesOfString: @"%d" withString: theDomain options: 0 range: NSMakeRange(0, [s length])];
ASSIGN(_baseDN, s);
}
}
if ([match length] > 0 || !_listRequiresDot)
{
ldapConnection = [self _ldapConnection];
@@ -2290,8 +2301,7 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection,
NSRange r;
r = [theLogin rangeOfString: @"@"];
if (r.location != NSNotFound &&
[_pristineBaseDN rangeOfString: @"%d"].location != NSNotFound)
if (r.location != NSNotFound && [_pristineBaseDN rangeOfString: @"%d"].location != NSNotFound)
{
s = [NSMutableString stringWithString: _pristineBaseDN];
[s replaceOccurrencesOfString: @"%d" withString: [theLogin substringFromIndex: r.location+1] options: 0 range: NSMakeRange(0, [s length])];
+1
View File
@@ -95,6 +95,7 @@
return keysWithFormat;
}
- (NSComparisonResult) caseInsensitiveDisplayNameCompare: (NSDictionary *) theDictionary
{
return [[self objectForKey: @"cn"] caseInsensitiveCompare: [theDictionary objectForKey: @"cn"]];
+4 -1
View File
@@ -80,7 +80,10 @@ static int cssEscapingCount;
{
hostR = [self rangeOfString: @"://"];
locationR = [[self substringFromIndex: (hostR.location + hostR.length)] rangeOfString: @"/"];
newURL = [self substringFromIndex: (hostR.location + hostR.length + locationR.location)];
if(locationR.location != NSNotFound)
newURL = [self substringFromIndex: (hostR.location + hostR.length + locationR.location)];
else
newURL = @"";
}
return newURL;
+7
View File
@@ -119,6 +119,13 @@
- (void) removeCASSessionWithTicket: (NSString *) ticket;
// OpenId Support
- (NSString *) openIdSessionFromServer: (NSString *) endpoint;
- (void) setOpenIdSession: (NSString *) openIdSession
forServer: (NSString *) endpoint;
- (NSString *) userOpendIdSessionFromServer: (NSString *) endpoint;
- (void) setUserOpendIdSessionFromServer: (NSString *) endpoint
nextCheckAfter: (NSString *) nextCheck;
//
// SAML2 support
//
+26
View File
@@ -683,6 +683,32 @@ static memcached_st *handle = NULL;
}
}
// OpenId support
- (NSString *) openIdSessionFromServer: (NSString *) endpoint
{
return [self valueForKey: [NSString stringWithFormat: @"openId:%@", endpoint]];
}
- (void) setOpenIdSession: (NSString *) openIdSession
forServer: (NSString *) endpoint
{
[self setValue: openIdSession
forKey: [NSString stringWithFormat: @"openId:%@", endpoint]];
}
- (NSString *) userOpendIdSessionFromServer: (NSString *) identifier
{
return [self valueForKey: [NSString stringWithFormat: @"userOpenId:%@", identifier]];
}
- (void) setUserOpendIdSessionFromServer: (NSString *) identifier
nextCheckAfter: (NSString *) nextCheck
{
[self setValue: nextCheck
forKey: [NSString stringWithFormat: @"userOpenId:%@", identifier]];
}
//
// SAML2 support
//
+1
View File
@@ -141,6 +141,7 @@
return password;
}
/* create SOGoUser */
- (SOGoUser *) userInContext: (WOContext *)_ctx
+1
View File
@@ -62,6 +62,7 @@ extern NSString *SOGoDefaultsSourceUnmutableSource;
- (void) setBool: (BOOL) value forKey: (NSString *) key;
- (BOOL) boolForKey: (NSString *) key;
- (BOOL) boolForKey: (NSString *) key andDict: (NSDictionary*) _dict;
- (void) setFloat: (float) value forKey: (NSString *) key;
- (float) floatForKey: (NSString *) key;
+23
View File
@@ -164,6 +164,29 @@ static Class NSStringKlass = Nil;
return value;
}
- (BOOL) boolForKey: (NSString *) key andDict: (NSDictionary*) _dict
{
id boolForKey;
BOOL value;
boolForKey = [_dict objectForKey: key];
if (boolForKey)
{
if ([boolForKey respondsToSelector: @selector (boolValue)])
value = [boolForKey boolValue];
else
{
[self warnWithFormat: @"expected a boolean for '%@' (ignored)",
key];
value = NO;
}
}
else
value = NO;
return value;
}
- (void) setFloat: (float) value
forKey: (NSString *) key
{
+2
View File
@@ -60,6 +60,7 @@
- (NSString *) vacationDefaultSubject;
- (NSString *) vacationHeaderTemplateFile;
- (NSString *) vacationFooterTemplateFile;
- (BOOL) vacationAllowZeroDays;
- (NSString *) mailingMechanism;
- (NSString *) smtpServer;
- (BOOL)smtpMasterUserEnabled;
@@ -77,6 +78,7 @@
- (BOOL) appointmentSendEMailNotifications;
- (BOOL) foldersSendEMailNotifications;
- (NSArray *) calendarDefaultRoles;
- (NSString *) calendarJistiBaseUrl;
- (NSArray *) contactsDefaultRoles;
- (NSArray *) refreshViewIntervals;
- (NSString *) subscriptionFolderFormat;
+22
View File
@@ -169,6 +169,16 @@
return [self stringArrayForKey: @"SOGoCalendarDefaultRoles"];
}
- (NSString *) calendarJistiBaseUrl
{
NSString *jitsiBaseUrl;
jitsiBaseUrl = [self stringForKey: @"SOGoCalendarJitsiBaseUrl"];
if(!jitsiBaseUrl)
jitsiBaseUrl = @"https://meet.jit.si";
return jitsiBaseUrl;
}
- (NSArray *) contactsDefaultRoles
{
return [self stringArrayForKey: @"SOGoContactsDefaultRoles"];
@@ -267,6 +277,18 @@
return [self stringForKey: @"SOGoVacationFooterTemplateFile"];
}
- (BOOL) vacationAllowZeroDays
{
id o;
o = [self stringForKey: @"SOGoVacationAllowZeroDays"];
if (o)
return [o boolValue];
return NO;
}
- (NSString *) mailingMechanism
{
NSString *mailingMechanism;
+1
View File
@@ -25,6 +25,7 @@
@class NSArray;
@class NSException;
@class NSString;
@class NSDictionary;
@class WOContext;
@class SOGoDomainDefaults;
+42 -7
View File
@@ -31,6 +31,7 @@
#import "NSString+Utilities.h"
#import "SOGoStaticAuthenticator.h"
#import "SOGoEmptyAuthenticator.h"
#import "SOGoWebAuthenticator.h"
#import "SOGoSystemDefaults.h"
#import "SOGoUser.h"
#import "SOGoUserManager.h"
@@ -265,7 +266,8 @@
inContext: (WOContext *) woContext
systemMessage: (BOOL) isSystemMessage
{
NSString *currentTo, *login, *password;
NSString *currentTo, *login, *password, *encryption, *protocol, *server;
NSString * smtpAuthMethod;
NSDictionary *currentAcount;
NSMutableArray *toErrors;
NSEnumerator *addresses;
@@ -273,6 +275,7 @@
NSException *result;
NSURL * smtpUrl;
SOGoUser* user;
SOGoSystemDefaults *sd;
BOOL doSmtpAuth;
result = nil;
@@ -288,12 +291,30 @@
currentAcount = [[user mailAccounts] objectAtIndex: userId];
//Check if we do an smtp authentication
doSmtpAuth = [authenticationType isEqualToString: @"plain"] && ![authenticator isKindOfClass: [SOGoEmptyAuthenticator class]];
smtpAuthMethod = authenticationType;
doSmtpAuth = ([smtpAuthMethod isEqualToString: @"plain"] || [smtpAuthMethod isEqualToString: @"xoauth2"])
&& ![authenticator isKindOfClass: [SOGoEmptyAuthenticator class]];
if(!doSmtpAuth && userId > 0)
{
doSmtpAuth = [currentAcount objectForKey: @"smtpAuth"] ? [[currentAcount objectForKey: @"smtpAuth"] boolValue] : NO;
}
sd = [SOGoSystemDefaults sharedSystemDefaults];
if(userId == 0 && [sd doesLoginTypeByDomain] && [authenticator isKindOfClass: [SOGoWebAuthenticator class]])
{
//Check if the authentication depends on the domain, only for webmail requets not for dav...
NSString *username, *_domain;
NSRange r;
username = [currentAcount objectForKey: @"userName"];
r = [username rangeOfString: @"@"];
if (r.location != NSNotFound)
{
_domain = [username substringFromIndex: r.location+1];
smtpAuthMethod = [sd getSmtpAuthMechForDomain: _domain];
}
}
NS_DURING
{
[client connect];
@@ -304,6 +325,7 @@
{
login = [currentAcount objectForKey: @"userName"];
password = [currentAcount objectForKey: @"password"];
smtpAuthMethod = "plain"; //Only support plain for auxiliary account
}
else
{
@@ -315,15 +337,27 @@
getExternalLoginForUID: [[authenticator userInContext: woContext] loginInDomain]
inDomain: [[authenticator userInContext: woContext] domain]];
password = [authenticator passwordInContext: woContext];
encryption = [currentAcount objectForKey: @"encryption"];
protocol = @"imap";
if ([encryption isEqualToString: @"ssl"] || [encryption isEqualToString: @"tls"])
protocol = @"imaps";
server = [NSString stringWithFormat: @"%@://%@", protocol, [currentAcount objectForKey: @"serverName"]];
if([authenticator isKindOfClass: [SOGoWebAuthenticator class]])
password = [authenticator smtpPasswordInContext: woContext forURL: server];
else
{
password = [authenticator passwordInContext: woContext];
smtpAuthMethod = @"plain"; //is a dav or activesync request, only support plain method
}
}
if (isSystemMessage
&& ![[[SOGoUserManager sharedUserManager] getEmailForUID: [[authenticator userInContext: woContext] loginInDomain]] isEqualToString: sender]
&& smtpMasterUserEnabled) {
if (![client plainAuthenticateUser: smtpMasterUserUsername
withPassword: smtpMasterUserPassword]) {
if (![client authenticateUser: smtpMasterUserUsername
withPassword: smtpMasterUserPassword
withMethod: smtpAuthMethod]) {
result = [NSException exceptionWithHTTPStatus: 500
reason: @"cannot send message:"
@" (smtp) authentication failure"];
@@ -334,8 +368,9 @@
{
if ([login length] == 0
|| [login isEqualToString: @"anonymous"]
|| ![client plainAuthenticateUser: login
withPassword: password])
|| ![client authenticateUser: login
withPassword: password
withMethod: smtpAuthMethod])
result = [NSException exceptionWithHTTPStatus: 500
reason: @"cannot send message:"
@" (smtp) authentication failure"];
+104
View File
@@ -0,0 +1,104 @@
/* SOGoCASSession.h - this file is part of SOGo
*
* Copyright (C) 2000-2023 Alinto.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef SOGOOPENIDSESSION_H
#define SOGOOPENIDSESSION_H
/* implementation of the OpenId Connect as required for a client/proxy:
https://openid.net/developers/how-connect-works/ */
#import <NGObjWeb/WOResponse.h>
#import <SOGo/SOGoObject.h>
@class NSString;
@class NSMutableDictionary;
@class NSURL;
@class NSJSONSerialization;
@interface SOGoOpenIdSession : SOGoObject
{
//For cache
BOOL cacheUpdateNeeded;
int userTokenInterval;
//From sogo.conf
BOOL openIdSessionIsOK;
NSString *openIdConfigUrl;
NSString *openIdScope;
NSString *openIdClient;
NSString *openIdClientSecret;
NSString *openIdEmailParam;
BOOL openIdEnableRefreshToken;
BOOL sendDomainInfo;
NSString *forDomain;
//From request to well-known/configuration
NSString *authorizationEndpoint;
NSString *tokenEndpoint;
NSString *introspectionEndpoint;
NSString *userinfoEndpoint;
NSString *endSessionEndpoint;
NSString *revocationEndpoint;
//Access token
NSString *accessToken;
NSString *refreshToken;
NSString *idToken;
NSString *tokenType;
NSNumber *expiresIn;
NSNumber *refreshExpiresIn;
}
+ (BOOL) checkUserConfig;
+ (SOGoOpenIdSession *) OpenIdSession: (NSString *) _domain;
+ (SOGoOpenIdSession *) OpenIdSessionWithConfig: (NSDictionary *) _config;
+ (SOGoOpenIdSession *) OpenIdSessionWithToken: (NSString *) token domain: (NSString *) _domain;
+ (SOGoOpenIdSession *) OpenIdSessionWithTokenAndConfig: (NSString *) token config: (NSDictionary *) _config;
+ (void) deleteValueForSessionKey: (NSString *) theSessionKey;
- (void) initialize;
- (void) initializeWithConfig: (NSDictionary *) _config;
- (BOOL) sessionIsOK;
- (WOResponse *) _performOpenIdRequest: (NSString *) endpoint
method: (NSString *) method
headers: (NSDictionary *) headers
body: (NSData *) body;
- (NSMutableDictionary *) fecthConfiguration: (NSString *) _domain;
- (void) setAccessToken;
- (NSString *) getRefreshToken;
- (NSString *) getToken;
- (NSString *) getCurrentToken;
- (NSString *) loginUrl: (NSString *) oldLocation;
- (NSMutableDictionary *) fetchToken: (NSString *) code redirect: (NSString *) oldLocation;
- (NSString *) logoutUrl;
- (NSMutableDictionary *) fetchUserInfo;
- (NSString *) _login;
- (NSString *) login: (NSString *) identifier;
@end
#endif /* SOGOOPENIDSESSION_H */
+785
View File
@@ -0,0 +1,785 @@
/* SOGoCASSession.m - this file is part of SOGo
*
* Copyright (C) 2010-2014 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <NGObjWeb/WOHTTPConnection.h>
#import <NGObjWeb/WORequest.h>
#import <NGObjWeb/WOResponse.h>
#import <NGExtensions/NSObject+Logs.h>
#import <SOGo/SOGoUser.h>
#import <GDLContentStore/GCSOpenIdFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
#import "NSDictionary+Utilities.h"
#import "NSString+Utilities.h"
#import "SOGoCache.h"
#import "SOGoSystemDefaults.h"
#import "SOGoOpenIdSession.h"
static BOOL SOGoOpenIDDebugEnabled = YES;
@implementation SOGoOpenIdSession
/// Check if all required parameters to set up a OpenIdSession are in sogo.conf
+ (BOOL) checkUserConfig
{
SOGoSystemDefaults *sd;
if(nil == [[GCSFolderManager defaultFolderManager] openIdFolder])
{
[self errorWithFormat: @"Something wrong with the table defined by OCSOpenIdURL"];
return NO;
}
sd = [SOGoSystemDefaults sharedSystemDefaults];
return ([sd openIdConfigUrl] && [sd openIdScope] && [sd openIdClient] && [sd openIdClientSecret]);
}
- (void) initializeWithConfig: (NSDictionary *) _config
{
SOGoSystemDefaults *sd;
id refreshTokenBool, domainInfo;
if([_config objectForKey: @"SOGoOpenIdConfigUrl"] &&
[_config objectForKey: @"SOGoOpenIdScope"] &&
[_config objectForKey: @"SOGoOpenIdClient"] &&
[_config objectForKey: @"SOGoOpenIdClientSecret"])
{
openIdConfigUrl = [_config objectForKey: @"SOGoOpenIdConfigUrl"];
openIdScope = [_config objectForKey: @"SOGoOpenIdScope"];
openIdClient = [_config objectForKey: @"SOGoOpenIdClient"];
openIdClientSecret = [_config objectForKey: @"SOGoOpenIdClientSecret"];
openIdEmailParam = [_config objectForKey: @"SOGoOpenIdEmailParam"];
openIdEnableRefreshToken = NO;
refreshTokenBool = [_config objectForKey: @"SOGoOpenIdEnableRefreshToken"];
if (refreshTokenBool && [refreshTokenBool respondsToSelector: @selector (boolValue)])
openIdEnableRefreshToken = [refreshTokenBool boolValue];
sendDomainInfo = NO;
domainInfo = [_config objectForKey: @"SOGoOpenIdSendDomainInfo"];
if (domainInfo && [domainInfo respondsToSelector: @selector (boolValue)])
sendDomainInfo = [domainInfo boolValue];
userTokenInterval = [_config objectForKey: @"SOGoOpenIdTokenCheckInterval"];
[self _loadSessionFromCache: forDomain];
if(cacheUpdateNeeded)
{
[self fecthConfiguration: forDomain];
}
}
else
{
[self errorWithFormat: @"Missing parameters from sogo.conf"];
}
}
- (void) initialize: (NSString*) _domain
{
SOGoSystemDefaults *sd;
NSDictionary *config;
NSString *type;
sd = [SOGoSystemDefaults sharedSystemDefaults];
SOGoOpenIDDebugEnabled = [sd openIdDebugEnabled];
openIdSessionIsOK = NO;
//Check if there is a root config or config per domain
if(_domain != nil && [sd doesLoginTypeByDomain])
{
forDomain = _domain;
type = [sd getLoginTypeForDomain: _domain];
if(type != nil && [type isEqualToString: @"openid"])
{
config = [sd getLoginConfigForDomain: _domain];
[self initializeWithConfig: config];
}
else
{
[self errorWithFormat: @"Missing parameters from sogo.conf"];
}
}
else if ([[self class] checkUserConfig])
{
openIdConfigUrl = [sd openIdConfigUrl];
openIdScope = [sd openIdScope];
openIdClient = [sd openIdClient];
openIdClientSecret = [sd openIdClientSecret];
openIdEmailParam = [sd openIdEmailParam];
openIdEnableRefreshToken = [sd openIdEnableRefreshToken];
userTokenInterval = [sd openIdTokenCheckInterval];
sendDomainInfo = [sd openIdSendDomainInfo];
forDomain = _domain;
[self _loadSessionFromCache: _domain];
if(cacheUpdateNeeded)
{
[self fecthConfiguration: _domain];
}
}
else
{
[self errorWithFormat: @"Missing parameters from sogo.conf"];
}
}
- (WOResponse *) _performOpenIdRequest: (NSString *) endpoint
method: (NSString *) method
headers: (NSDictionary *) headers
body: (NSData *) body
{
NSURL *url;
NSUInteger status;
WORequest *request;
WOResponse *response;
WOHTTPConnection *httpConnection;
url = [NSURL URLWithString: endpoint];
if (url)
{
if(SOGoOpenIDDebugEnabled)
{
NSLog(@"OpenId perform request: %@ %@", method, endpoint);
NSLog(@"OpenId perform request, headers %@", headers);
// if(body)
// NSLog(@"OpenId perform request: content %@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
}
httpConnection = [[WOHTTPConnection alloc] initWithURL: url];
[httpConnection autorelease];
request = [[WORequest alloc] initWithMethod: method
uri: [endpoint hostlessURL]
httpVersion: @"HTTP/1.1"
headers: headers content: body
userInfo: nil];
[request autorelease];
[httpConnection sendRequest: request];
response = [httpConnection readResponse];
status = [response status];
if(status >= 200 && status <500 && status != 404)
return response;
else if (status == 404)
{
[self errorWithFormat: @"OpenID endpoint not found (404): %@", endpoint];
return nil;
}
else
{
[self errorWithFormat: @"OpenID server internal error during %@: %@", endpoint, response];
return nil;
}
}
else
{
[self errorWithFormat: @"OpenID can't handle endpoint (not a url): '%@'", endpoint];
return nil;
}
}
- (NSMutableDictionary *) fecthConfiguration: (NSString*) _domain
{
NSString *content;
WOResponse * response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *config, *headers;
NSURL *url;
result = [NSMutableDictionary dictionary];
[result setObject: self->openIdConfigUrl forKey: @"url"];
url = [NSURL URLWithString: self->openIdConfigUrl ];
if (url)
{
if(self->sendDomainInfo && _domain != nil && [_domain length] > 0)
headers = [NSDictionary dictionaryWithObject: _domain forKey: @"sogo-user-domain"];
else
headers = nil;
response = [self _performOpenIdRequest: self->openIdConfigUrl
method: @"GET"
headers: headers
body: nil];
if (response)
{
status = [response status];
if(status >= 200 && status <300)
{
content = [response contentString];
config = [content objectFromJSONString];
self->authorizationEndpoint = [config objectForKey: @"authorization_endpoint"];
self->tokenEndpoint = [config objectForKey: @"token_endpoint"];
self->userinfoEndpoint = [config objectForKey: @"userinfo_endpoint"];
self->endSessionEndpoint = [config objectForKey: @"end_session_endpoint"];
//Optionnals?
if([config objectForKey: @"introspection_endpoint"])
self->introspectionEndpoint = [config objectForKey: @"introspection_endpoint"];
if([config objectForKey: @"revocation_endpoint"])
self->revocationEndpoint = [config objectForKey: @"revocation_endpoint"];
openIdSessionIsOK = YES;
[self _saveSessionToCache: _domain];
}
else
{
[self logWithFormat: @"Error during fetching the configuration (status %d), response: %@", status, response];
}
}
else
[result setObject: @"http-error" forKey: @"error"];
}
else
[result setObject: @"invalid-url" forKey: @"error"];
return result;
}
+ (SOGoOpenIdSession *) OpenIdSession: (NSString *) _domain
{
SOGoOpenIdSession *newSession;
newSession = [self new];
[newSession autorelease];
[newSession initialize: _domain];
return newSession;
}
+ (SOGoOpenIdSession *) OpenIdSessionWithConfig: (NSDictionary *) _config
{
SOGoOpenIdSession *newSession;
newSession = [self new];
[newSession autorelease];
[newSession initializeWithConfig: _config];
return newSession;
}
+ (SOGoOpenIdSession *) OpenIdSessionWithToken: (NSString *) token domain: (NSString *) _domain
{
SOGoOpenIdSession *newSession;
if (token)
{
newSession = [self new];
[newSession autorelease];
[newSession initialize: _domain];
[newSession setAccessToken: token];
}
else
newSession = nil;
return newSession;
}
+ (SOGoOpenIdSession *) OpenIdSessionWithTokenAndConfig: (NSString *) token config: (NSDictionary *) _config
{
SOGoOpenIdSession *newSession;
if (token)
{
newSession = [self new];
[newSession autorelease];
[newSession initializeWithConfig: _config];
[newSession setAccessToken: token];
}
else
newSession = nil;
return newSession;
}
- (BOOL) sessionIsOk
{
return self->openIdSessionIsOK;
}
- (void) _loadSessionFromCache: (NSString*) _domain
{
SOGoCache *cache;
NSString *jsonSession, *cacheKey;
NSDictionary *sessionDict;
if(_domain != nil && [_domain length] > 0)
cacheKey = [self->openIdConfigUrl stringByAppendingFormat: @":%@", _domain];
else
cacheKey = self->openIdConfigUrl;
cache = [SOGoCache sharedCache];
jsonSession = [cache openIdSessionFromServer: cacheKey];
if ([jsonSession length])
{
sessionDict = [jsonSession objectFromJSONString];
ASSIGN (authorizationEndpoint, [sessionDict objectForKey: @"authorization_endpoint"]);
ASSIGN (tokenEndpoint, [sessionDict objectForKey: @"token_endpoint"]);
ASSIGN (userinfoEndpoint, [sessionDict objectForKey: @"userinfo_endpoint"]);
ASSIGN (endSessionEndpoint, [sessionDict objectForKey: @"end_session_endpoint"]);
//Optionnals?
if([sessionDict objectForKey: @"introspection_endpoint"])
ASSIGN (introspectionEndpoint, [sessionDict objectForKey: @"introspection_endpoint"]);
if([sessionDict objectForKey: @"revocation_endpoint"])
ASSIGN (revocationEndpoint, [sessionDict objectForKey: @"revocation_endpoint"]);
openIdSessionIsOK = YES;
}
else
cacheUpdateNeeded = YES;
}
- (void) _saveSessionToCache: (NSString*) _domain
{
SOGoCache *cache;
NSString *jsonSession, *cacheKey;
NSMutableDictionary *sessionDict;
cache = [SOGoCache sharedCache];
sessionDict = [NSMutableDictionary dictionary];
[sessionDict setObject: authorizationEndpoint forKey: @"authorization_endpoint"];
[sessionDict setObject: tokenEndpoint forKey: @"token_endpoint"];
[sessionDict setObject: userinfoEndpoint forKey: @"userinfo_endpoint"];
[sessionDict setObject: endSessionEndpoint forKey: @"end_session_endpoint"];
//Optionnals?
if(introspectionEndpoint)
[sessionDict setObject: introspectionEndpoint forKey: @"introspection_endpoint"];
if(revocationEndpoint)
[sessionDict setObject: revocationEndpoint forKey: @"revocation_endpoint"];
jsonSession = [sessionDict jsonRepresentation];
if(_domain != nil && [_domain length] > 0)
cacheKey = [self->openIdConfigUrl stringByAppendingFormat: @":%@", _domain];
else
cacheKey = self->openIdConfigUrl;
[cache setOpenIdSession: jsonSession
forServer: cacheKey];
}
- (BOOL) _loadUserFromCache: (NSString *) email
{
/*
Return NO if the user token must be check again, YES the user is valid for now
*/
SOGoCache *cache;
NSString *identifier, *nextCheck;
NSTimeInterval nextCheckTime, timeNow;
identifier = [self->openIdClient stringByAppendingString: email];
cache = [SOGoCache sharedCache];
nextCheck = [cache userOpendIdSessionFromServer: identifier];
if ([nextCheck length])
{
timeNow = [[NSDate date] timeIntervalSince1970];
nextCheckTime = [nextCheck doubleValue];
if(timeNow > nextCheckTime)
return NO;
else
return YES;
}
else
return NO;
}
- (void) _saveUserToCache: (NSString *) email
{
SOGoCache *cache;
NSString *identifier, *nextCheck;
NSTimeInterval nextCheckTime;
identifier = [self->openIdClient stringByAppendingString: email];
nextCheckTime = [[NSDate date] timeIntervalSince1970] + self->userTokenInterval;
nextCheck = [NSString stringWithFormat:@"%f", nextCheckTime];
cache = [SOGoCache sharedCache];
[cache setUserOpendIdSessionFromServer: identifier
nextCheckAfter: nextCheck];
}
- (NSString*) loginUrl: (NSString *) oldLocation
{
NSString* logUrl;
logUrl = [self->authorizationEndpoint stringByAppendingFormat: @"?scope=%@", self->openIdScope];
logUrl = [logUrl stringByAppendingString: @"&response_type=code"];
logUrl = [logUrl stringByAppendingFormat: @"&client_id=%@", self->openIdClient];
logUrl = [logUrl stringByAppendingFormat: @"&redirect_uri=%@", oldLocation];
if(self->forDomain != nil && [self->forDomain length] > 0)
logUrl = [logUrl stringByAppendingFormat: @"&sogo_domain=%@", forDomain];
// logurl = [self->logurl stringByAppendingFormat: @"&state=%@", state];
return logUrl;
}
- (NSString *) logoutUrl
{
return self->endSessionEndpoint;
}
- (NSString*) getRefreshToken
{
return self->refreshToken;
}
- (NSString*) getToken
{
return self->accessToken;
}
- (void) setAccessToken: (NSString* ) token
{
self->accessToken = token;
}
- (NSString *) getCurrentToken
{
NSString *currentToken;
//See if the current token has been refreshed
currentToken = [[[GCSFolderManager defaultFolderManager] openIdFolder] getNewToken: self->accessToken];
if(currentToken)
{
//be sure the old token has been cleaned
[[[GCSFolderManager defaultFolderManager] openIdFolder] deleteOpenIdSessionFor: self->accessToken];
return currentToken;
}
return self->accessToken;
}
- (NSMutableDictionary *) fetchToken: (NSString * ) code redirect: (NSString *) oldLocation
{
NSString *location, *form, *content;
WOResponse *response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *headers;
NSDictionary *tokenRet;
NSURL *url;
result = [NSMutableDictionary dictionary];
[result setObject: @"ok" forKey: @"error"];
location = self->tokenEndpoint;
url = [NSURL URLWithString: location];
if (url)
{
form = @"grant_type=authorization_code";
form = [form stringByAppendingFormat: @"&code=%@", code];
form = [form stringByAppendingFormat: @"&redirect_uri=%@", [oldLocation stringByEscapingURL]];
form = [form stringByAppendingFormat: @"&client_secret=%@", self->openIdClientSecret];
form = [form stringByAppendingFormat: @"&client_id=%@", self->openIdClient];
if(self->sendDomainInfo && self->forDomain != nil && [self->forDomain length] > 0)
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
self->forDomain, @"sogo-user-domain", nil];
else
headers = [NSDictionary dictionaryWithObject: @"application/x-www-form-urlencoded" forKey: @"content-type"];
response = [self _performOpenIdRequest: location
method: @"POST"
headers: headers
body: [form dataUsingEncoding:NSUTF8StringEncoding]];
if (response)
{
status = [response status];
if(status >= 200 && status <300)
{
content = [response contentString];
tokenRet = [content objectFromJSONString];
if (SOGoOpenIDDebugEnabled)
{
NSLog(@"fetch token response: %@", tokenRet);
}
self->accessToken = [tokenRet objectForKey: @"access_token"];
self->refreshToken = [tokenRet objectForKey: @"refresh_token"];
self->refreshExpiresIn = [tokenRet objectForKey: @"refresh_expires_in"];
self->idToken = [tokenRet objectForKey: @"id_token"];
self->tokenType = [tokenRet objectForKey: @"token_type"];
self->expiresIn = [tokenRet objectForKey: @"expires_in"];
}
else
{
[self logWithFormat: @"Error during fetching the token (status %d), response: %@", status, response];
}
}
else
{
[result setObject: @"http-error" forKey: @"error"];
}
}
else
[result setObject: @"invalid-url" forKey: @"error"];
return result;
}
- (NSMutableDictionary *) refreshToken: (NSString * ) userRefreshToken
{
NSString *location, *form, *content;
WOResponse *response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *headers;
NSDictionary *refreshTokenRet;
NSURL *url;
result = [NSMutableDictionary dictionary];
[result setObject: @"ok" forKey: @"error"];
if(!userRefreshToken || [userRefreshToken length] == 0)
{
[result setObject: @"invalid-token" forKey: @"error"];
return result;
}
location = self->tokenEndpoint;
url = [NSURL URLWithString: location];
if (url)
{
form = @"grant_type=refresh_token";
form = [form stringByAppendingFormat: @"&scope=%@", self->openIdScope];
form = [form stringByAppendingFormat: @"&refresh_token=%@", userRefreshToken];
form = [form stringByAppendingFormat: @"&client_secret=%@", self->openIdClientSecret];
form = [form stringByAppendingFormat: @"&client_id=%@", self->openIdClient];
if(self->sendDomainInfo && self->forDomain != nil && [self->forDomain length] > 0)
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
self->forDomain, @"sogo-user-domain", nil];
else
headers = [NSDictionary dictionaryWithObject: @"application/x-www-form-urlencoded" forKey: @"content-type"];
response = [self _performOpenIdRequest: location
method: @"POST"
headers: headers
body: [form dataUsingEncoding:NSUTF8StringEncoding]];
if (response)
{
status = [response status];
if(status >= 200 && status <300)
{
content = [response contentString];
refreshTokenRet = [content objectFromJSONString];
if (SOGoOpenIDDebugEnabled)
{
NSLog(@"refresh token response: %@", refreshTokenRet);
}
self->accessToken = [refreshTokenRet objectForKey: @"access_token"];
self->refreshToken = [refreshTokenRet objectForKey: @"refresh_token"];
self->refreshExpiresIn = [refreshTokenRet objectForKey: @"refresh_expires_in"];
self->tokenType = [refreshTokenRet objectForKey: @"token_type"];
self->expiresIn = [refreshTokenRet objectForKey: @"expires_in"];
}
else
{
[self logWithFormat: @"Error during refreshing the token (status %d), response: %@", status, response];
}
}
else
{
[result setObject: @"http-error" forKey: @"error"];
}
}
else
[result setObject: @"invalid-url" forKey: @"error"];
return result;
}
- (NSMutableDictionary *) fetchUserInfo
{
NSString *location, *auth, *content;
WOResponse *response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *profile, *headers;
NSURL *url;
NSString *email;
result = [NSMutableDictionary dictionary];
[result setObject: @"ok" forKey: @"error"];
location = self->userinfoEndpoint;
url = [NSURL URLWithString: location];
if (url)
{
auth = [NSString stringWithFormat: @"Bearer %@", self->accessToken];
if(self->sendDomainInfo && self->forDomain != nil && [self->forDomain length] > 0)
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
self->forDomain, @"sogo-user-domain",
auth, @"authorization", nil];
else
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
auth, @"authorization", nil];
response = [self _performOpenIdRequest: location
method: @"GET"
headers: headers
body: nil];
if (response)
{
status = [response status];
if(status >= 200 && status <300)
{
content = [response contentString];
profile = [content objectFromJSONString];
if(SOGoOpenIDDebugEnabled && profile)
NSLog(@"OpenId fetch user info, profile is %@", profile);
/*profile = {"sub":"70a3e6a1-37cf-4cf6-b114-6973aabca86a",
"email_verified":false,
"address":{},
"name":"Foo Bar",
"preferred_username":"myuser",
"given_name":"Foo",
"family_name":"Bar",
"email":"myuser@user.com"}*/
if (email = [profile objectForKey: self->openIdEmailParam])
{
if(self->userTokenInterval > 0)
[self _saveUserToCache: email];
[result setObject: email forKey: @"login"];
}
else
[result setObject: @"no mail found" forKey: @"error"];
}
else
{
[self logWithFormat: @"Error during fetching the token (status %d), response: %@", status, response];
[result setObject: @"http-error" forKey: @"error"];
}
}
else
{
[result setObject: @"http-error" forKey: @"error"];
}
}
else
[result setObject: @"invalid-url" forKey: @"error"];
return result;
}
+ (void) deleteValueForSessionKey: (NSString *) theSessionKey
{
GCSOpenIdFolder *folder;
folder = [[GCSFolderManager defaultFolderManager] openIdFolder];
[folder deleteOpenIdSessionFor: theSessionKey];
}
- (NSString *) _login
{
NSMutableDictionary *resultUserInfo, *resultResfreh;
NSString* _oldAccessToken;
resultUserInfo = [self fetchUserInfo];
if ([[resultUserInfo objectForKey: @"error"] isEqualToString: @"ok"])
{
//Save some infos as the refresh token to the database
[[[GCSFolderManager defaultFolderManager] openIdFolder] writeOpenIdSession: self->accessToken
withOldSession: nil
withRefreshToken: self->refreshToken
withExpire: self->expiresIn
withRefreshExpire: self->refreshExpiresIn];
return [resultUserInfo objectForKey: @"login"];
}
else if(openIdEnableRefreshToken)
{
//try to refresh
if(self->accessToken)
{
self->refreshToken = [[[GCSFolderManager defaultFolderManager] openIdFolder] getRefreshToken: self->accessToken];
//remove old session
[[[GCSFolderManager defaultFolderManager] openIdFolder] deleteOpenIdSessionFor: self->accessToken];
}
if(self->refreshToken)
{
_oldAccessToken = self->accessToken;
resultResfreh = [self refreshToken: self->refreshToken];
if ([[resultResfreh objectForKey: @"error"] isEqualToString: @"ok"])
{
resultUserInfo = [self fetchUserInfo];
if ([[resultUserInfo objectForKey: @"error"] isEqualToString: @"ok"])
{
[[[GCSFolderManager defaultFolderManager] openIdFolder] writeOpenIdSession: self->accessToken
withOldSession: _oldAccessToken
withRefreshToken: self->refreshToken
withExpire: self->expiresIn
withRefreshExpire: self->refreshExpiresIn];
return [resultUserInfo objectForKey: @"login"];
}
}
}
//The acces token hasn't work, delete the session in database if needed
if(self->accessToken)
{
[[[GCSFolderManager defaultFolderManager] openIdFolder] deleteOpenIdSessionFor: self->accessToken];
}
[self errorWithFormat: @"Can't get user email from profile because: %@", [resultUserInfo objectForKey: @"error"]];
}
else
{
//remove old session
[[[GCSFolderManager defaultFolderManager] openIdFolder] deleteOpenIdSessionFor: self->accessToken];
}
return @"anonymous";
}
- (NSString *) login: (NSString *) email
{
//Check if we need to fetch userinfo
if(self->userTokenInterval > 0 && [self _loadUserFromCache: email])
{
return email;
}
else
{
return [self _login];
}
}
@end
+12 -4
View File
@@ -247,12 +247,20 @@
usingKey: theKey];
r = [decodedValue rangeOfString: @":"];
*theLogin = [decodedValue substringToIndex: r.location];
*thePassword = [decodedValue substringFromIndex: r.location+1];
if (r.location != NSNotFound)
{
*theLogin = [decodedValue substringToIndex: r.location];
*thePassword = [decodedValue substringFromIndex: r.location+1];
}
else
{
*theLogin = nil;
*thePassword = nil;
}
*theDomain = nil;
sd = [SOGoSystemDefaults sharedSystemDefaults];
if ([sd enableDomainBasedUID])
if (*theLogin &&[sd enableDomainBasedUID])
{
r = [*theLogin rangeOfString: @"@" options: NSBackwardsSearch];
if (r.location != NSNotFound)
+20 -3
View File
@@ -28,6 +28,7 @@
#import <SOGo/NSDictionary+Utilities.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoDomainDefaults.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoTextTemplateFile.h>
@@ -697,8 +698,11 @@ static NSString *sieveScriptName = @"sogo";
NSDictionary *result;
NSString *login, *authname, *password;
SOGoDomainDefaults *dd;
SOGoSystemDefaults *sd;
NGSieveClient *client;
NSString *sieveServer, *sieveScheme, *sieveQuery, *imapServer;
NSString *imapAuthMech, *userDomain;
NSRange r;
NSURL *url, *cUrl;
int sievePort;
BOOL connected;
@@ -773,7 +777,20 @@ static NSString *sieveScriptName = @"sogo";
url = [NSURL URLWithString: [NSString stringWithFormat: @"%@://%@:%d%@",
sieveScheme, sieveServer, sievePort, sieveQuery]];
client = [[NGSieveClient alloc] initWithURL: url];
//In case of differrent auth method for different domain, check it
sd = [SOGoSystemDefaults sharedSystemDefaults];
imapAuthMech = nil;
if([sd doesLoginTypeByDomain])
{
r = [theUsername rangeOfString: @"@"];
if (r.location != NSNotFound)
{
userDomain = [theUsername substringFromIndex: r.location+1];
imapAuthMech = [sd getImapAuthMechForDomain: userDomain];
}
}
client = [[NGSieveClient alloc] initWithURL: url andAuthMech: imapAuthMech];
if (!client) {
[self errorWithFormat: @"Sieve connection failed on %@", [url description]];
@@ -1016,8 +1033,8 @@ static NSString *sieveScriptName = @"sogo";
text = [NSString stringWithFormat: @"%@%@", text, [templateFile textForUser: user]];
}
if (days == 0)
days = 7;
if (days <= 0)
days = [dd vacationAllowZeroDays] ? 0 : 7;
vacation_script = [NSMutableString string];
+18
View File
@@ -36,6 +36,11 @@ static const NSString *kDisableSharingCalendar = @"Calendar";
+ (SOGoSystemDefaults *) sharedSystemDefaults;
- (NSArray *) domainIds;
- (BOOL) doesLoginTypeByDomain;
- (NSString *) getLoginTypeForDomain: (NSString*) _domain;
- (NSString *) getLoginConfigForDomain: (NSDictionary*) _domain;
- (NSString *) getImapAuthMechForDomain: (NSString*) _domain;
- (NSString *) getSmtpAuthMechForDomain: (NSString*) _domain;
- (BOOL) forbidUnknownDomainsAuth;
- (NSArray *) domainsAllowed;
- (BOOL) enableDomainBasedUID;
@@ -55,6 +60,7 @@ static const NSString *kDisableSharingCalendar = @"Calendar";
- (BOOL) isWebAccessEnabled;
- (BOOL) isCalendarDAVAccessEnabled;
- (BOOL) isCalendarJitsiLinkEnabled;
- (BOOL) isAddressBookDAVAccessEnabled;
- (BOOL) enableEMailAlarms;
@@ -76,6 +82,7 @@ static const NSString *kDisableSharingCalendar = @"Calendar";
- (BOOL) uixDebugEnabled;
- (BOOL) easDebugEnabled;
- (BOOL) openIdDebugEnabled;
- (BOOL) tnefDecoderDebugEnabled;
- (BOOL) xsrfValidationEnabled;
@@ -88,11 +95,22 @@ NSComparisonResult languageSort(id el1, id el2, void *context);
- (NSString *) loginSuffix;
- (NSString *) authenticationType;
- (BOOL) isSsoUsed: (NSString *) domain;
- (NSString *) davAuthenticationType;
- (NSString *) CASServiceURL;
- (BOOL) CASLogoutEnabled;
- (NSString *) openIdConfigUrl;
- (NSString *) openIdScope;
- (NSString *) openIdClient;
- (NSString *) openIdClientSecret;
- (NSString *) openIdEmailParam;
- (BOOL) openIdEnableRefreshToken;
- (BOOL) openIdLogoutEnabled: (NSString *) _domain;
- (int) openIdTokenCheckInterval;
- (BOOL) openIdSendDomainInfo;
- (NSString *) SAML2PrivateKeyLocation;
- (NSString *) SAML2CertificateLocation;
- (NSString *) SAML2IdpMetadataLocation;
+229
View File
@@ -262,6 +262,143 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
return [domains allKeys];
}
- (BOOL) doesLoginTypeByDomain
{
return ([self dictionaryForKey: @"SOGoLoginTypeByDomain"] != nil);
}
- (NSString *) getLoginTypeForDomain: (NSString*) _domain
{
NSDictionary *domains, *config;
NSString *type;
if(![self doesLoginTypeByDomain])
return nil;
domains = [self dictionaryForKey: @"SOGoLoginTypeByDomain"];
if([domains objectForKey: _domain])
{
config = [domains objectForKey: _domain];
}
else if([domains objectForKey: @"login_default"])
{
config = [domains objectForKey: @"login_default"];
}
else
return nil;
if((type = [config objectForKey: @"type"]))
{
return type;
}
else
return nil;
}
- (NSString *) getImapAuthMechForDomain: (NSString*) _domain
{
NSDictionary *domains, *config;
NSString *type;
if(![self doesLoginTypeByDomain])
return nil;
domains = [self dictionaryForKey: @"SOGoLoginTypeByDomain"];
if([domains objectForKey: _domain])
{
config = [domains objectForKey: _domain];
}
else if([domains objectForKey: @"login_default"])
{
config = [domains objectForKey: @"login_default"];
}
else
return nil;
if((type = [config objectForKey: @"imapAuthMech"]))
{
return type;
}
else
return nil;
}
- (NSString *) getSmtpAuthMechForDomain: (NSString*) _domain
{
NSDictionary *domains, *config;
NSString *type;
if(![self doesLoginTypeByDomain])
return nil;
domains = [self dictionaryForKey: @"SOGoLoginTypeByDomain"];
if([domains objectForKey: _domain])
{
config = [domains objectForKey: _domain];
}
else if([domains objectForKey: @"login_default"])
{
config = [domains objectForKey: @"login_default"];
}
else
return nil;
if((type = [config objectForKey: @"smtpAuthMech"]))
{
return type;
}
else
return nil;
}
- (NSString *) getLoginConfigForDomain: (NSDictionary*) _domain
{
NSDictionary *domains, *config;
if(![self doesLoginTypeByDomain])
return nil;
domains = [self dictionaryForKey: @"SOGoLoginTypeByDomain"];
if([domains objectForKey: _domain])
{
config = [domains objectForKey: _domain];
}
else if([domains objectForKey: @"login_default"])
{
config = [domains objectForKey: @"login_default"];
}
if(config)
return config;
else
return nil;
}
- (BOOL) hasOpenIdType
{
if([self doesLoginTypeByDomain])
{
NSDictionary *domainsConfig;
NSEnumerator *e;
NSString *domain, *type;
if(![self doesLoginTypeByDomain])
return NO;
domainsConfig = [self dictionaryForKey: @"SOGoLoginTypeByDomain"];
e = [domainsConfig keyEnumerator];
while((domain = [e nextObject]))
{
if((type = [[domainsConfig objectForKey: domain] objectForKey: @"type"]))
{
if([type isEqualToString: @"openid"])
return YES;
}
}
return NO;
}
else
return [[self authenticationType] isEqualToString: @"openid"];
}
- (BOOL) enableDomainBasedUID
{
return [self boolForKey: @"SOGoEnableDomainBasedUID"];
@@ -441,6 +578,11 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
return [self boolForKey: @"SOGoCalendarDAVAccessEnabled"];
}
- (BOOL) isCalendarJitsiLinkEnabled
{
return [self boolForKey: @"SOGoCalendarEnableJitsiLink"];
}
- (BOOL) isAddressBookDAVAccessEnabled
{
return [self boolForKey: @"SOGoAddressBookDAVAccessEnabled"];
@@ -507,6 +649,11 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
return [self boolForKey: @"SOGoEASDebugEnabled"];
}
- (BOOL) openIdDebugEnabled
{
return [self boolForKey: @"SOGoOpenIDDebugEnabled"];
}
- (BOOL) tnefDecoderDebugEnabled
{
return [self boolForKey: @"SOGoTnefDecoderDebugEnabled"];
@@ -577,6 +724,16 @@ NSComparisonResult languageSort(id el1, id el2, void *context)
return [[self stringForKey: @"SOGoAuthenticationType"] lowercaseString];
}
- (BOOL) isSsoUsed: (NSString *) domain
{
NSString* authType;
authType = [self getLoginTypeForDomain: domain];
if(!authType)
authType = [self authenticationType];
return ([authType isEqualToString: @"cas"] || [authType isEqualToString: @"saml2"] || [authType isEqualToString: @"openid"]);
}
- (NSString *) davAuthenticationType
{
return [[self stringForKey: @"SOGoDAVAuthenticationType"] lowercaseString];
@@ -592,6 +749,78 @@ NSComparisonResult languageSort(id el1, id el2, void *context)
return [self boolForKey: @"SOGoCASLogoutEnabled"];
}
/* OpenId Support */
- (NSString *) openIdConfigUrl
{
return [self stringForKey: @"SOGoOpenIdConfigUrl"];
}
- (NSString *) openIdScope
{
return [self stringForKey: @"SOGoOpenIdScope"];
}
- (NSString *) openIdClient
{
return [self stringForKey: @"SOGoOpenIdClient"];
}
- (NSString *) openIdClientSecret
{
return [self stringForKey: @"SOGoOpenIdClientSecret"];
}
- (NSString *) openIdEmailParam
{
NSString *emailParam;
emailParam = [self stringForKey: @"SOGoOpenIdEmailParam"];
if(!emailParam)
emailParam = @"email";
return emailParam;
}
- (BOOL) openIdLogoutEnabled: (NSString *) _domain
{
if(_domain && [self doesLoginTypeByDomain])
{
NSDictionary *config;
NSString *type;
id value;
if((config = [self getLoginConfigForDomain: _domain]))
{
if((type = [config objectForKey: @"type"]) && [type isEqualToString:@"openid"])
return [self boolForKey: @"SOGoOpenIdLogoutEnabled" andDict: config];
}
return NO;
}
return [self boolForKey: @"SOGoOpenIdLogoutEnabled"];
}
- (BOOL) openIdSendDomainInfo
{
return [self boolForKey: @"SOGoOpenIdSendDomainInfo"];
}
- (int) openIdTokenCheckInterval
{
int v;
v = [self integerForKey: @"SOGoOpenIdTokenCheckInterval"];
if (!v)
v = 0;
if(v<0)
v = 0;
return v;
}
- (BOOL) openIdEnableRefreshToken
{
return [self boolForKey: @"SOGoOpenIdEnableRefreshToken"];
}
/* SAML2 support */
- (NSString *) SAML2PrivateKeyLocation
{
+1
View File
@@ -91,6 +91,7 @@
/* properties */
- (NSString *) domain;
- (NSString *) loginDomain;
- (id <SOGoSource>) authenticationSource;
- (NSArray *) allEmails;
+13
View File
@@ -301,6 +301,19 @@ static const NSString *kEncryptedUserNamePrefix = @"uenc";
return [self _fetchFieldForUser: @"c_domain"];
}
- (NSString *) loginDomain
{
NSRange r;
NSString *domain = nil;
r = [self->login rangeOfString: @"@"];
if (r.location != NSNotFound)
{
domain = [self->login substringFromIndex: r.location+1];
}
return domain;
}
- (id <SOGoSource>) authenticationSource
{
NSString *sourceID;
+38 -20
View File
@@ -1093,30 +1093,37 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
domain = nil;
infos = nil;
//Try to get the domain from the uid
r = [uid rangeOfString: @"@" options: NSBackwardsSearch];
if (r.location != NSNotFound)
{
// The domain is probably appended to the username;
// make sure it is a defined domain in the configuration.
domain = [uid substringFromIndex: (r.location + r.length)];
if ([self isDomainDefined: domain])
username = [uid substringToIndex: r.location];
else
domain = nil;
}
sd = [SOGoSystemDefaults sharedSystemDefaults];
if ([sd enableDomainBasedUID])
{
r = [uid rangeOfString: @"@" options: NSBackwardsSearch];
if (r.location != NSNotFound)
{
// The domain is probably appended to the username;
// make sure it is a defined domain in the configuration.
domain = [uid substringFromIndex: (r.location + r.length)];
if ([self isDomainDefined: domain])
username = [uid substringToIndex: r.location];
else
domain = nil;
}
if (domain != nil)
infos = [self contactInfosForUserWithUIDorEmail: username
if (domain != nil)
{
if ([sd enableDomainBasedUID])
infos = [self contactInfosForUserWithUIDorEmail: username
inDomain: domain];
}
else
infos = [self contactInfosForUserWithUIDorEmail: uid
inDomain: domain];
}
if (infos == nil)
{
// If the user was not found using the domain or if no domain was detected,
// search using the original uid.
infos = [self contactInfosForUserWithUIDorEmail: uid
inDomain: nil];
}
return infos;
}
@@ -1145,8 +1152,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
if ([currentUser isKindOfClass: NSNullK])
currentUser = nil;
else if (!([currentUser objectForKey: @"emails"]
&& [currentUser objectForKey: @"cn"]))
else if (!([currentUser objectForKey: @"emails"] && [currentUser objectForKey: @"cn"]))
{
// We make sure that we either have no occurence of a cache entry or
// that we have an occurence with only a cached password. In the
@@ -1163,6 +1169,19 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
}
else
newUser = NO;
if(!domain)
{
//No domain provided is there one?
NSRange r;
r = [uid rangeOfString: @"@" options: NSBackwardsSearch];
if (r.location != NSNotFound)
{
domain = [uid substringFromIndex: (r.location + r.length)];
if (![self isDomainDefined: domain])
domain = nil;
}
}
[self _fillContactInfosForUser: currentUser
withUIDorEmail: aUID
inDomain: domain];
@@ -1340,8 +1359,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
- (NSArray *) fetchContactsMatching: (NSString *) filter
inDomain: (NSString *) domain
{
return [self
_fetchEntriesInSources: [self addressBookSourceIDsInDomain: domain]
return [self _fetchEntriesInSources: [self addressBookSourceIDsInDomain: domain]
matching: filter
inDomain: domain];
}
+3
View File
@@ -27,6 +27,7 @@
#import "SOGoConstants.h"
@class NSString;
@class NSMutableDictionary;
@class WOContext;
@class WOCookie;
@@ -58,6 +59,8 @@
andPassword: (NSString *) password
inContext: (WOContext *) context;
- (NSArray *)getCookiesIfNeeded: (WOContext *)_ctx;
@end
#endif /* _SOGOWEBAUTHENTICATOR_H_ */
+127 -14
View File
@@ -35,6 +35,7 @@
#import "SOGoCache.h"
#import "SOGoCASSession.h"
#import "SOGoOpenIdSession.h"
#import "SOGoPermissions.h"
#import "SOGoSession.h"
#import "SOGoSystemDefaults.h"
@@ -133,22 +134,53 @@
additionalInfo: (NSMutableDictionary **)_additionalInfo
useCache: (BOOL) _useCache
{
SOGoCASSession *session;
SOGoCASSession *casSession;
SOGoOpenIdSession * openIdSession;
SOGoSystemDefaults *sd;
NSString *authenticationType;
NSString* loginDomain;
BOOL rc;
sd = [SOGoSystemDefaults sharedSystemDefaults];
//Basic check
if(!_login)
return NO;
if(_login && [_login length] == 0)
return NO;
loginDomain = nil;
if(*_domain == nil || [*_domain length] == 0)
{
NSRange r;
r = [_login rangeOfString: @"@"];
if (r.location != NSNotFound)
{
loginDomain = [_login substringFromIndex: r.location+1];
}
}
if([sd doesLoginTypeByDomain])
authenticationType = [sd getLoginTypeForDomain: loginDomain];
else
authenticationType = [sd authenticationType];
authenticationType = [sd authenticationType];
if ([authenticationType isEqualToString: @"cas"])
{
session = [SOGoCASSession CASSessionWithIdentifier: _pwd fromProxy: NO];
if (session)
rc = [[session login] isEqualToString: _login];
casSession = [SOGoCASSession CASSessionWithIdentifier: _pwd fromProxy: NO];
if (casSession)
rc = [[casSession login] isEqualToString: _login];
else
rc = NO;
}
else if ([authenticationType isEqualToString: @"openid"])
{
openIdSession = [SOGoOpenIdSession OpenIdSessionWithToken: _pwd domain: loginDomain];
if (openIdSession)
rc = [[openIdSession login: _login] isEqualToString: _login];
else
rc = NO;
}
#if defined(SAML2_CONFIG)
else if ([authenticationType isEqualToString: @"saml2"])
{
@@ -170,7 +202,6 @@
grace: _grace
additionalInfo: _additionalInfo
useCache: _useCache];
//[self logWithFormat: @"Checked login with ppolicy enabled: %d %d %d", *_perr, *_expire, *_grace];
// It's important to return the real value here. The callee will handle
@@ -249,7 +280,8 @@
login: &login
domain: &domain
password: &pwd];
if (![self checkLogin: login
password: pwd
domain: &domain
@@ -272,32 +304,42 @@
{
NSString *authType, *password;
SOGoSystemDefaults *sd;
SOGoUser *user;
NSRange r;
NSString *loginDomain, *login;
password = [self passwordInContext: context];
if ([password length])
{
user = [self userInContext: context];
login = [user loginInDomain];
r = [login rangeOfString: @"@"];
if (r.location != NSNotFound)
loginDomain = [login substringFromIndex: r.location+1];
else
loginDomain = nil;
sd = [SOGoSystemDefaults sharedSystemDefaults];
authType = [sd authenticationType];
if([sd doesLoginTypeByDomain])
authType = [sd getLoginTypeForDomain: loginDomain];
else
authType = [sd authenticationType];
if ([authType isEqualToString: @"cas"])
{
SOGoCASSession *session;
SOGoUser *user;
NSString *service, *scheme;
session = [SOGoCASSession CASSessionWithIdentifier: password
fromProxy: NO];
user = [self userInContext: context];
// Try configured CAS service name first
service = [[user domainDefaults] imapCASServiceName];
if (!service)
{
// We must NOT assume the scheme exists
scheme = [server scheme];
if (!scheme)
scheme = @"imap";
service = [NSString stringWithFormat: @"%@://%@",
scheme, [server host]];
}
@@ -306,10 +348,18 @@
[session invalidateTicketForService: service];
password = [session ticketForService: service];
if ([password length] || renew)
[session updateCache];
}
else if ([authType isEqualToString: @"openid"])
{
SOGoOpenIdSession* session;
//If the token has been refresh during the request, we need to use the new access_token
//as the one from the cookie is no more valid
session = [SOGoOpenIdSession OpenIdSessionWithToken: password domain: loginDomain];
password = [session getCurrentToken];
}
#if defined(SAML2_CONFIG)
else if ([authType isEqualToString: @"saml2"])
{
@@ -332,6 +382,16 @@
return password;
}
- (NSString *) smtpPasswordInContext: (WOContext *) context
forURL: (NSURL *) server
{
NSString *password;
password = [self imapPasswordInContext: context forURL: server forceRenew:NO];
return password;
}
/* create SOGoUser */
- (SOGoUser *) userWithLogin: (NSString *) login
@@ -436,4 +496,57 @@
return authCookie;
}
- (NSArray *) getCookiesIfNeeded: (WOContext *)_ctx
{
NSArray *listCookies = nil;
SOGoSystemDefaults *sd;
NSString *authType, *username, *login, *loginDomain;
NSRange r;
SOGoUser *user;
user = [self userInContext: _ctx];
login = [user loginDomain];
r = [login rangeOfString: @"@"];
if (r.location != NSNotFound)
loginDomain = [login substringFromIndex: r.location+1];
else
loginDomain = nil;
sd = [SOGoSystemDefaults sharedSystemDefaults];
if(loginDomain && [sd doesLoginTypeByDomain])
authType = [sd getLoginTypeForDomain: loginDomain];
else
authType = [sd authenticationType];
if([authType isEqualToString:@"openid"] && [sd openIdEnableRefreshToken])
{
NSString *currentPassword, *newPassword;
SOGoOpenIdSession *openIdSession;
WOCookie* newCookie;
currentPassword = [self passwordInContext: _ctx];
newPassword = [self imapPasswordInContext: _ctx forURL: nil forceRenew: NO];
if(currentPassword && newPassword && ![newPassword isEqualToString: currentPassword])
{
openIdSession = [SOGoOpenIdSession OpenIdSessionWithToken: newPassword domain: loginDomain];
if (openIdSession)
username = [openIdSession login: @""]; //Force to refresh the name
else
username = [[self userInContext: _ctx] login];
newCookie = [self cookieWithUsername: username
andPassword: newPassword
inContext: _ctx];
listCookies = [[NSArray alloc] initWithObjects: newCookie, nil];
[listCookies autorelease];
}
if(listCookies && [listCookies isKindOfClass:[NSArray class]] && [listCookies count] > 0)
return listCookies;
else
return nil;
}
else
return nil;
}
@end /* SOGoWebAuthenticator */
+1
View File
@@ -21,6 +21,7 @@ $(SOGO_TOOL)_OBJC_FILES += \
SOGoToolRemoveDoubles.m \
SOGoToolRenameUser.m \
SOGoToolCheckupUser.m \
SOGoToolCleanOpenIdSessions.m \
SOGoToolCleanupUser.m \
SOGoToolRestore.m \
SOGoToolCreateFolder.m \
+137
View File
@@ -0,0 +1,137 @@
/* SOGoToolCleanOpenIdSessions.m - this file is part of SOGo
*
* Copyright (C) 2012-2021 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
#import <Foundation/NSUserDefaults.h>
#import <GDLAccess/EOAdaptorChannel.h>
#import <GDLContentStore/GCSChannelManager.h>
#import <GDLContentStore/NSURL+GCS.h>
#import <NGExtensions/NSNull+misc.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoSession.h>
#import <SOGo/SOGoOpenIdSession.h>
#import "SOGoTool.h"
@interface SOGoToolCleanOpenIdSessions : SOGoTool
@end
@implementation SOGoToolCleanOpenIdSessions
+ (NSString *) command
{
return @"clean-openid-sessions";
}
+ (NSString *) description
{
return @"clean user openid sessions that are expired";
}
- (void) usage
{
fprintf (stderr, "clean-openid-sessions\n\n"
"\n"
"The clean-openid-sessions action should be configured as a cronjob.\n");
}
- (BOOL) cleanExpiredOpenIdSession
{
BOOL rc;
EOAdaptorChannel *channel;
GCSChannelManager *cm;
NSArray *attrs;
NSDictionary *qresult;
NSException *ex;
NSString *sql, *sessionsFolderURL, *sessionID;
NSURL *tableURL;
NSUserDefaults *ud;
unsigned int now;
rc = YES;
ud = [NSUserDefaults standardUserDefaults];
now = [[NSCalendarDate calendarDate] timeIntervalSince1970];
sessionID = nil;
sessionsFolderURL = [ud stringForKey: @"OCSOpenIdURL"];
if (!sessionsFolderURL)
{
if (verbose)
NSLog(@"Couldn't read OCSOpenIdURL");
return rc = NO;
}
tableURL = [[NSURL alloc] initWithString: sessionsFolderURL];
cm = [GCSChannelManager defaultChannelManager];
channel = [cm acquireOpenChannelForURL: tableURL];
if (!channel)
{
/* FIXME: nice error msg */
NSLog(@"Can't acquire channel");
return rc = NO;
}
sql = [NSString stringWithFormat: @"SELECT c_user_session FROM %@ WHERE c_access_token_expires_in <= %d AND c_refresh_token_expires_in <= %d",
[tableURL gcsTableName], now, now];
ex = [channel evaluateExpressionX: sql];
if (ex)
{
NSLog(@"%@", [ex reason]);
[ex raise];
return rc = NO;
}
attrs = [channel describeResults: NO];
while ((qresult = [channel fetchAttributes: attrs withZone: NULL]))
{
sessionID = [qresult objectForKey: @"c_user_session"];
if (sessionID)
{
if (verbose)
NSLog(@"Removing session %@", sessionID);
[SOGoOpenIdSession deleteValueForSessionKey: sessionID];
}
}
[cm releaseChannel: channel immediately: YES];
if (verbose && sessionID == nil)
NSLog(@"No session to remove on openId table");
return rc;
}
- (BOOL) run
{
BOOL rc;
rc = [self cleanExpiredOpenIdSession];
return rc;
}
@end
+1
View File
@@ -33,6 +33,7 @@
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoSession.h>
#import <SOGo/SOGoOpenIdSession.h>
#import "SOGoTool.h"
+25 -9
View File
@@ -488,13 +488,14 @@
&& [user isSuperUser]);
}
- (BOOL) usesCASAuthentication
- (BOOL) usesOpenIdAuthentication
{
SOGoSystemDefaults *sd;
sd = [SOGoSystemDefaults sharedSystemDefaults];
return [[sd authenticationType] isEqualToString: @"cas"];
return [[sd authenticationType] isEqualToString: @"openid"];
}
- (BOOL) usesSAML2Authenticationx
@@ -537,19 +538,34 @@
BOOL canLogoff;
id auth;
SOGoSystemDefaults *sd;
NSString *authType;
NSString *authType, *login, *loginDomain;
NSRange r;
auth = [[self clientObject] authenticatorInContext: context];
if ([auth respondsToSelector: @selector (cookieNameInContext:)])
{
sd = [SOGoSystemDefaults sharedSystemDefaults];
authType = [sd authenticationType];
if ([authType isEqualToString: @"cas"])
canLogoff = [sd CASLogoutEnabled];
else if ([authType isEqualToString: @"saml2"])
canLogoff = [sd SAML2LogoutEnabled];
login = [[context activeUser] login];
r = [login rangeOfString: @"@"];
if (r.location != NSNotFound)
loginDomain = [login substringFromIndex: r.location+1];
else
canLogoff = [[auth cookieNameInContext: context] length] > 0;
loginDomain = nil;
if(loginDomain && [sd doesLoginTypeByDomain])
authType = [sd getLoginTypeForDomain: loginDomain];
else
authType = [sd authenticationType];
if ([authType isEqualToString: @"cas"])
canLogoff = [sd CASLogoutEnabled];
else if ([authType isEqualToString: @"saml2"])
canLogoff = [sd SAML2LogoutEnabled];
else if ([authType isEqualToString: @"openid"])
canLogoff = [sd openIdLogoutEnabled: loginDomain];
else
canLogoff = [[auth cookieNameInContext: context] length] > 0;
}
else
canLogoff = NO;
+20 -1
View File
@@ -85,6 +85,7 @@ _xmlCharsetForCharset (NSString *charset)
{ @"windows-1255", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1255 -> utf8 conversion
{ @"windows-1256", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1255 -> utf8 conversion
{ @"windows-1257", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1257 -> utf8 conversion
{ @"windows-874", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-874 -> utf8 conversion
{ @"gb2312", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
{ @"gbk", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
{ @"gb18030", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
@@ -521,7 +522,25 @@ static NSString *_sanitizeHtmlForDisplay(NSString *content)
{
/* [resultPart appendString:
@"src=\"/SOGo.woa/WebServerResources/empty.gif\""]; */
name = @"unsafe-src";
//Check if the image is base64 ant not url
NSUInteger i, c;
BOOL isBase64 = NO;
for (i = 0, c = [_attributes count]; i < c; i++) {
NSString *type, *value;
type = [_attributes nameAtIndex:i];
if ([type isEqualToString:@"src"])
{
value = [_attributes valueAtIndex:i];
if([value length] > 4 && [[value substringToIndex: 4] isEqualToString:@"data"])
{
isBase64 = YES;
break;
}
}
}
if(!isBase64)
name = @"unsafe-src";
}
else
skipAttribute = YES;
+87 -52
View File
@@ -170,60 +170,95 @@
emailEvent = [self _emailEvent];
if (emailEvent)
{
*eventObject = [self _eventObjectWithUID: [emailEvent uid]];
if ([*eventObject isNew])
{
*eventObject = [self _eventObjectWithUID: [emailEvent uid]];
if ([*eventObject isNew])
{
chosenEvent = emailEvent;
[*eventObject saveCalendar: [emailEvent parent]];
}
else
{
if ([emailEvent recurrenceId])
{
// Event attached to email is not complete -- retrieve it
// from the database.
NSString *recurrenceTime;
recurrenceTime = [NSString stringWithFormat: @"%f",
[[emailEvent recurrenceId] timeIntervalSince1970]];
calendarEvent = (iCalEvent *)[*eventObject lookupOccurrence: recurrenceTime];
}
else
calendarEvent = (iCalEvent *) [*eventObject component: NO secure: NO];
if (calendarEvent != nil)
{
// Calendar event still exists -- verify which of the calendar
// and email events is the most recent. We must also update
// the event (or recurrence-id) with the email's content, otherwise
// we would never get major properties updates
if ([calendarEvent compare: emailEvent] == NSOrderedAscending)
{
iCalCalendar *parent;
parent = [calendarEvent parent];
[parent removeChild: calendarEvent];
[parent addChild: emailEvent];
[*eventObject saveCalendar: parent];
[*eventObject flush];
chosenEvent = emailEvent;
}
else
{
chosenEvent = calendarEvent;
if (![[[chosenEvent parent] method] length])
[[chosenEvent parent] setMethod: [[emailEvent parent] method]];
}
}
else
chosenEvent = emailEvent;
}
organizer = [chosenEvent organizer];
if (![[organizer rfc822Email] length])
[self _fixOrganizerInEvent: chosenEvent];
chosenEvent = emailEvent;
[*eventObject saveCalendar: [emailEvent parent]];
}
else
{
if ([emailEvent recurrenceId])
{
// Event attached to email is not complete -- retrieve it
// from the database.
NSString *recurrenceTime;
recurrenceTime = [NSString stringWithFormat: @"%f",
[[emailEvent recurrenceId] timeIntervalSince1970]];
calendarEvent = (iCalEvent *)[*eventObject lookupOccurrence: recurrenceTime];
}
else
calendarEvent = (iCalEvent *) [*eventObject component: NO secure: NO];
if (calendarEvent != nil)
{
// Calendar event still exists -- verify which of the calendar
// and email events is the most recent. We must also update
// the event (or recurrence-id) with the email's content, otherwise
// we would never get major properties updates
if ([calendarEvent compare: emailEvent] == NSOrderedAscending)
{
iCalCalendar *parent;
parent = [calendarEvent parent];
//careful, sogo vcalendar objets for reccurent event needs to have the main event first, then all the vevent with reccurence-id
if(![emailEvent hasRecurrenceRules] || [emailEvent recurrenceId])
{
[parent removeChild: calendarEvent];
[parent addChild: emailEvent];
}
else
{
//The main recurrent event has been changed, put it first and also change all the exception with the correct reccurence-id
NSMutableArray *childrenNew;
NSEnumerator *childrenOldEnum, *childrenNewEnum;
iCalEvent *child;
NSCalendarDate *oldStartDate, *newStartDate, *recId;
NSTimeInterval interval;
oldStartDate = [calendarEvent startDate];
newStartDate = [emailEvent startDate];
interval = [newStartDate timeIntervalSinceDate: oldStartDate];
[parent removeChild: calendarEvent];
childrenNew = [NSMutableArray array];
childrenOldEnum = [[parent childrenWithTag:@"vevent"] objectEnumerator];
while((child = [childrenOldEnum nextObject]))
{
[parent removeChild: child];
if((recId = [child recurrenceId]))
[child setRecurrenceId: [recId dateByAddingTimeInterval: interval]];
[childrenNew addObject: child];
}
[parent addChild: emailEvent];
childrenNewEnum = [childrenNew objectEnumerator];
while((child = [childrenNewEnum nextObject]))
{
[parent addChild: child];
}
}
[*eventObject saveCalendar: parent];
[*eventObject flush];
chosenEvent = emailEvent;
}
else
{
chosenEvent = calendarEvent;
if (![[[chosenEvent parent] method] length])
[[chosenEvent parent] setMethod: [[emailEvent parent] method]];
}
}
else
chosenEvent = emailEvent;
}
organizer = [chosenEvent organizer];
if (![[organizer rfc822Email] length])
[self _fixOrganizerInEvent: chosenEvent];
}
else
chosenEvent = nil;
+7 -2
View File
@@ -466,6 +466,11 @@
return sort;
}
- (NSString *)sanitizeFilterString:(NSString *)str
{
return [str stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
}
- (EOQualifier *) searchQualifier
{
EOQualifier *qualifier, *notDeleted, *searchQualifier;
@@ -498,8 +503,8 @@
for (i = 0; i < max; i++)
{
filter = [filters objectAtIndex:i];
searchBy = [filter objectForKey: @"searchBy"];
searchInput = [filter objectForKey: @"searchInput"];
searchBy = [self sanitizeFilterString: [filter objectForKey: @"searchBy"]];
searchInput = [self sanitizeFilterString:[filter objectForKey: @"searchInput"]];
if (searchBy && searchInput)
{
+426 -70
View File
@@ -40,6 +40,7 @@
#import <SOGo/SOGoBuild.h>
#import <SOGo/SOGoCache.h>
#import <SOGo/SOGoCASSession.h>
#import <SOGo/SOGoOpenIdSession.h>
#if defined(SAML2_CONFIG)
#import <SOGo/SOGoSAML2Session.h>
#endif /* SAML2_ENABLE */
@@ -145,6 +146,7 @@ static const NSString *kJwtKey = @"jwt";
- (WOCookie *) _authLocationCookie: (BOOL) cookieReset
withName: (NSString *) cookieName
withValue: (NSString *) _value
{
WOCookie *locationCookie;
NSString *appName;
@@ -152,7 +154,10 @@ static const NSString *kJwtKey = @"jwt";
NSCalendarDate *date;
rq = [context request];
locationCookie = [WOCookie cookieWithName: cookieName value: [rq uri]];
if(_value)
locationCookie = [WOCookie cookieWithName: cookieName value: _value];
else
locationCookie = [WOCookie cookieWithName: cookieName value: [rq uri]];
appName = [rq applicationName];
[locationCookie setPath: [NSString stringWithFormat: @"/%@/", appName]];
if (cookieReset)
@@ -165,6 +170,28 @@ static const NSString *kJwtKey = @"jwt";
return locationCookie;
}
- (WOCookie *) _domainCookie: (BOOL) cookieReset
withDomain: (NSString *) _domain
{
WOCookie *domainCookie;
NSString *appName;
WORequest *rq;
NSCalendarDate *date;
rq = [context request];
domainCookie = [WOCookie cookieWithName: @"sogo-user-domain" value: _domain];
appName = [rq applicationName];
[domainCookie setPath: [NSString stringWithFormat: @"/%@/", appName]];
if (cookieReset)
{
date = [NSCalendarDate calendarDate];
[date setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]];
[domainCookie setExpires: [date yesterday]];
}
return domainCookie;
}
//
//
//
@@ -425,6 +452,7 @@ static const NSString *kJwtKey = @"jwt";
return response;
}
- (NSDictionary *) _casRedirectKeys
{
NSDictionary *redirectKeys;
@@ -478,42 +506,43 @@ static const NSString *kJwtKey = @"jwt";
if ([login isEqualToString: @"anonymous"])
login = nil;
if (!login)
{
rq = [context request];
ticket = [rq formValueForKey: @"ticket"];
if ([ticket length])
{
rq = [context request];
ticket = [rq formValueForKey: @"ticket"];
if ([ticket length])
{
casSession = [SOGoCASSession CASSessionWithTicket: ticket
fromProxy: NO];
login = [casSession login];
if ([login length])
{
auth = [[WOApplication application]
authenticatorInContext: context];
casCookie = [auth cookieWithUsername: login
andPassword: [casSession identifier]
inContext: context];
[casSession updateCache];
newLocation = [rq cookieValueForKey: @"cas-location"];
/* login callback, we expire the "cas-location" cookie, created
below */
casLocationCookie = [self _authLocationCookie: YES
withName: @"cas-location"];
}
}
else
{
/* anonymous and no ticket, possibly a logout request from CAS
* See: https://wiki.jasig.org/display/CASUM/Single+Sign+Out
*/
logoutRequest = [rq formValueForKey: @"logoutRequest"];
if ([logoutRequest length])
{
[SOGoCASSession handleLogoutRequest: logoutRequest];
return [self responseWithStatus: 200];
}
}
casSession = [SOGoCASSession CASSessionWithTicket: ticket
fromProxy: NO];
login = [casSession login];
if ([login length])
{
auth = [[WOApplication application]
authenticatorInContext: context];
casCookie = [auth cookieWithUsername: login
andPassword: [casSession identifier]
inContext: context];
[casSession updateCache];
newLocation = [rq cookieValueForKey: @"cas-location"];
/* login callback, we expire the "cas-location" cookie, created
below */
casLocationCookie = [self _authLocationCookie: YES
withName: @"cas-location"
withValue: nil];
}
}
else
{
/* anonymous and no ticket, possibly a logout request from CAS
* See: https://wiki.jasig.org/display/CASUM/Single+Sign+Out
*/
logoutRequest = [rq formValueForKey: @"logoutRequest"];
if ([logoutRequest length])
{
[SOGoCASSession handleLogoutRequest: logoutRequest];
return [self responseWithStatus: 200];
}
}
}
else
ticket = nil;
@@ -537,7 +566,8 @@ static const NSString *kJwtKey = @"jwt";
newLocation = [SOGoCASSession CASURLWithAction: @"login"
andParameters: [self _casRedirectKeys]];
casLocationCookie = [self _authLocationCookie: NO
withName: @"cas-location"];
withName: @"cas-location"
withValue: nil];
}
response = [self redirectToLocation: newLocation];
if (casCookie)
@@ -548,6 +578,131 @@ static const NSString *kJwtKey = @"jwt";
return response;
}
- (id <WOActionResults>) _openidDefaultAction: (NSString *) _domain
{
WOResponse *response;
NSString *login, *redirectLocation, *serverUrl;
NSString *sessionState, *code, *refreshTokenValue;
NSURL *newLocation, *oldLocation;
NSDictionary *formValues;
SOGoUser *loggedInUser;
WOCookie *openIdCookie, *openIdCookieLocation, *openIdRefreshCookie, *domainCookie;
WORequest *rq;
SOGoWebAuthenticator *auth;
SOGoOpenIdSession *openIdSession;
id value;
openIdCookie = nil;
openIdCookieLocation = nil;
openIdRefreshCookie = nil;
domainCookie = nil;
newLocation = nil;
rq = [context request];
//Check if the domain is stored in a cookie if not given
if(_domain == nil || [_domain length] == 0)
_domain = [rq cookieValueForKey: @"sogo-user-domain"]; //_domain can still be nil aftert his
openIdSession = [SOGoOpenIdSession OpenIdSession: _domain];
if(![openIdSession sessionIsOk])
{
return [NSException exceptionWithHTTPStatus: 502 /* Bad OpenId Configuration */
reason: [NSString stringWithFormat: @"OpenId server not found or has unexpected behavior, contact your admin."]];
}
login = [[context activeUser] login];
if ([login isEqualToString: @"anonymous"])
login = nil;
if (!login)
{
//You get here if you nerver been logged in or if you token is expired
serverUrl = [[context serverURL] absoluteString];
redirectLocation = [NSString stringWithFormat: @"%@/%@/", serverUrl, [rq applicationName]];
if((formValues = [rq formValues]) && [formValues objectForKey: @"code"])
{
//You get here if this is the callback of openid after you logged in
//NOT MANDATORY
// value = [formValues objectForKey: @"session_state"];
// if ([value isKindOfClass: [NSArray class]])
// sessionState = [value lastObject];
// else
// sessionState = value;
value = [formValues objectForKey: @"code"];
if ([value isKindOfClass: [NSArray class]])
code = [value lastObject];
else
code = value;
[openIdSession fetchToken: code redirect: redirectLocation];
login = [openIdSession login: @""];
if ([login length])
{
auth = [[WOApplication application] authenticatorInContext: context];
openIdCookie = [auth cookieWithUsername: login
andPassword: [openIdSession getToken]
inContext: context];
}
newLocation = [rq cookieValueForKey: @"openid-location"];
openIdCookieLocation = [self _authLocationCookie: YES withName: @"openid-location" withValue: nil];
domainCookie = [self _domainCookie: YES withDomain: _domain];
}
// else if((formValues = [rq formValues]) && [formValues objectForKey: @"action"])
// {
// value = [formValues objectForKey: @"action"];
// if ([value isKindOfClass: [NSArray class]])
// code = [value lastObject];
// else
// code = value;
// if([code isEqualToString:@"redirect"])
// {
// //this action onlye serve to make a redirection to openId server after a GET request
// newLocation = [openIdSession loginUrl: redirectLocation];
// }
//}
else
{
// //You get here the first time you access sogo, it redirect to last location
// if([[rq method] isEqualToString: @"POST"])
// //To avoid making a redirection to openid server after a post request, we first redirect to a get method
// newLocation = [NSString stringWithFormat: @"%@?action=redirect", redirectLocation];
// else
if(_domain != nil && [_domain length] > 0)
{
//add the domain cookie to get it after the redirect
domainCookie = [self _domainCookie: NO withDomain: _domain];
}
newLocation = [openIdSession loginUrl: redirectLocation];
openIdCookieLocation = [self _authLocationCookie: NO withName: @"openid-location" withValue: nil];
}
}
else
{
if (!newLocation)
{
oldLocation = [[self clientObject] baseURLInContext: context];
newLocation = [NSString stringWithFormat: @"%@%@", oldLocation, [login stringByEscapingURL]];
}
loggedInUser = [SOGoUser userWithLogin: login];
[self _checkAutoReloadWebCalendars: loggedInUser];
}
response = [self redirectToLocation: newLocation];
if (openIdCookie)
[response addCookie: openIdCookie];
if (openIdCookieLocation)
[response addCookie: openIdCookieLocation];
if(domainCookie)
[response addCookie: domainCookie];
//[response setStatus: 303];
return response;
}
#if defined(SAML2_CONFIG)
- (id <WOActionResults>) _saml2DefaultAction
{
@@ -571,7 +726,8 @@ static const NSString *kJwtKey = @"jwt";
newLocation = [rq cookieValueForKey: @"saml2-location"];
if (newLocation)
saml2LocationCookie = [self _authLocationCookie: YES
withName: @"saml2-location"];
withName: @"saml2-location"
withValue: nil];
else
{
oldLocation = [[self clientObject] baseURLInContext: context];
@@ -586,7 +742,8 @@ static const NSString *kJwtKey = @"jwt";
{
newLocation = [SOGoSAML2Session authenticationURLInContext: context];
saml2LocationCookie = [self _authLocationCookie: NO
withName: @"saml2-location"];
withName: @"saml2-location"
withValue: nil];
}
response = [self redirectToLocation: newLocation];
@@ -607,43 +764,191 @@ static const NSString *kJwtKey = @"jwt";
login = nil;
if (login)
{
oldLocation = [[self clientObject] baseURLInContext: context];
response
= [self redirectToLocation: [NSString stringWithFormat: @"%@%@",
oldLocation,
[[SOGoUser getEncryptedUsernameIfNeeded:login request: [context request]] stringByEscapingURL]]];
}
{
oldLocation = [[self clientObject] baseURLInContext: context];
response = [self redirectToLocation: [NSString stringWithFormat: @"%@%@", oldLocation,
[[SOGoUser getEncryptedUsernameIfNeeded:login request: [context request]] stringByEscapingURL]]];
}
else
{
oldLocation = [[context request] uri];
if ([context clientObject]
&& ![oldLocation hasSuffix: @"/"]
&& ![oldLocation hasSuffix: @"/view"])
response = [self redirectToLocation:
[NSString stringWithFormat: @"%@/", oldLocation]];
else
response = self;
}
{
oldLocation = [[context request] uri];
if ([context clientObject] && ![oldLocation hasSuffix: @"/"] && ![oldLocation hasSuffix: @"/view"])
response = [self redirectToLocation: [NSString stringWithFormat: @"%@/", oldLocation]];
else
response = self;
}
return response;
}
- (WOResponse *) connectNameAction
{
WOResponse *response;
WORequest *request;
NSDictionary *params;
NSString *username, *language, *domain, *type, *serverUrl, *redirectLocation;
NSRange r;
request = [context request];
params = [[request contentAsString] objectFromJSONString];
username = [params objectForKey: @"userName"];
//Extract the domain
r = [username rangeOfString: @"@"];
if (r.location != NSNotFound)
{
domain = [username substringFromIndex: r.location+1];
type = [[SOGoSystemDefaults sharedSystemDefaults] getLoginTypeForDomain: domain];
if(type != nil)
{
if([type isEqualToString: @"plain"])
{
//Only reload the page with the name
serverUrl = [[context serverURL] absoluteString];
redirectLocation = [NSString stringWithFormat: @"%@/%@/login?hint=%@", serverUrl, [request applicationName], username];
//response = [self redirectToLocation: [NSString stringWithFormat: @"%@/", redirectLocation]];
response = [self responseWithStatus: 200 andJSONRepresentation:
[NSDictionary dictionaryWithObjectsAndKeys: redirectLocation, @"redirect", nil]];
}
else if([type isEqualToString: @"openid"])
{
SOGoOpenIdSession *openIdSession;
WOCookie *domainCookie, *openIdCookieLocation;
//With openId, the user will be redirected to the openid server for login
//With set the domain in a cookie to know it after the openid does the callbacl
serverUrl = [[context serverURL] absoluteString];
redirectLocation = [NSString stringWithFormat: @"%@/%@/", serverUrl, [request applicationName]];
openIdSession = [SOGoOpenIdSession OpenIdSession: domain];
domainCookie = [self _domainCookie: NO withDomain: domain];
openIdCookieLocation = [self _authLocationCookie: NO withName: @"openid-location" withValue: redirectLocation];
response = [self responseWithStatus: 200 andJSONRepresentation:
[NSDictionary dictionaryWithObjectsAndKeys: [openIdSession loginUrl: redirectLocation], @"redirect", nil]];
[response addCookie: domainCookie];
[response addCookie: openIdCookieLocation];
}
else if([type isEqualToString: @"cas"] || [type isEqualToString: @"saml2"])
{
[self logWithFormat: @"Unsupported type for now: %@", type];
response = [self responseWithStatus: 400
andString: @"Domain Authentication type not supported"];
}
else
{
[self logWithFormat: @"Unknown type: %@", type];
response = [self responseWithStatus: 400
andString: @"Unknwon Authentication type"];
}
}
else
{
[self logWithFormat: @"Auth type for Domain given is not set or there is no default value: %@", domain];
response = [self responseWithStatus: 400
andString: @"Domain unknown"];
}
}
else
{
[self logWithFormat: @"Domain is required but not found for user recovery exception for user %@", username];
response = [self responseWithStatus: 400
andString: @"Domain needed in the login"];
}
return response;
}
- (id <WOActionResults>) defaultAction
{
NSString *authenticationType;
NSString *authenticationType, *loginDomain, *type, *_domain;
SOGoSystemDefaults* sd;
id <WOActionResults> result;
authenticationType = [[SOGoSystemDefaults sharedSystemDefaults]
authenticationType];
if ([authenticationType isEqualToString: @"cas"])
result = [self _casDefaultAction];
#if defined(SAML2_CONFIG)
else if ([authenticationType isEqualToString: @"saml2"])
result = [self _saml2DefaultAction];
#endif /* SAML2_CONFIG */
else
result = [self _standardDefaultAction];
loginDomain = nil;
sd = [SOGoSystemDefaults sharedSystemDefaults];
if([sd doesLoginTypeByDomain])
{
NSString *login;
//In this mode sogo will ask the mail of the user before doing any authentication
//Check if a user is already logged in
_domain = [[context request] cookieValueForKey: @"sogo-user-domain"]; //_domain can still be nil aftert his
if(_domain != nil)
{
//This is a callback of an openid session.
return [self _openidDefaultAction: _domain];
}
login = [[context activeUser] login];
if ([login isEqualToString: @"anonymous"])
login = nil;
if(!login && !_domain)
return [self _standardDefaultAction];
else
{
//User already logged in. Extract the domain in that case
NSRange r;
r = [login rangeOfString: @"@"];
if (r.location != NSNotFound)
{
loginDomain = [login substringFromIndex: r.location+1];
type = [sd getLoginTypeForDomain: loginDomain];
if(type)
{
if([type isEqualToString: @"plain"])
{
result = [self _standardDefaultAction];
}
else if([type isEqualToString: @"openid"])
{
result = [self _openidDefaultAction: loginDomain];
}
else if([type isEqualToString: @"cas"] || [type isEqualToString: @"saml2"])
{
[self logWithFormat: @"Unsupported type for now: %@", type];
result = [self responseWithStatus: 400
andString: @"Domain Authentication type not supported"];
}
else
{
[self logWithFormat: @"Unknown type: %@", type];
result = [self responseWithStatus: 400
andString: @"Unknwon Authentication type"];
}
}
else
{
[self logWithFormat: @"Auth type for Domain given is not set or there is no default value: %@", loginDomain];
result = [self responseWithStatus: 400
andString: @"Domain unknown"];
}
}
else
{
loginDomain = nil;
result = [self _standardDefaultAction];
}
}
}
else {
authenticationType = [sd authenticationType];
if ([authenticationType isEqualToString: @"cas"])
result = [self _casDefaultAction];
else if ([authenticationType isEqualToString: @"openid"])
result = [self _openidDefaultAction: loginDomain];
#if defined(SAML2_CONFIG)
else if ([authenticationType isEqualToString: @"saml2"])
result = [self _saml2DefaultAction];
#endif /* SAML2_CONFIG */
else
result = [self _standardDefaultAction];
}
return result;
}
@@ -673,6 +978,57 @@ static const NSString *kJwtKey = @"jwt";
return ([[self loginDomains] count] > 0);
}
- (BOOL) doLoginUsernameFirst
{
return [[SOGoSystemDefaults sharedSystemDefaults] doesLoginTypeByDomain];
}
- (BOOL) doFullLogin
{
//Either we directly do the full login (meaning the user inputs its username and password)
//Or we do it in two times:
//phase 1: user types its username first -> only show the username input
//phase 2: user types its password -> show all inputs
//In phase 2, the username will be in the query at key "login"
if([self doLoginUsernameFirst]){
WORequest *rq;
BOOL hasLogin;
NSDictionary *formValues;
rq = [context request];
hasLogin = ((formValues=[rq formValues]) && [formValues objectForKey: @"hint"]);
return hasLogin;
}
return YES;
}
- (BOOL) doPartialLogin
{
return ![self doFullLogin];
}
- (NSString *) getLoginHint
{
id value;
WORequest *rq;
NSString* login;
NSDictionary *formValues;
login = @"";
rq = [context request];
if((formValues=[rq formValues]) && (value=[formValues objectForKey: @"hint"]))
{
if ([value isKindOfClass: [NSArray class]])
login = [value lastObject];
else
login = value;
}
return login;
}
- (BOOL) hasPasswordRecovery
{
return [[SOGoSystemDefaults sharedSystemDefaults] isPasswordRecoveryEnabled];
@@ -1036,8 +1392,7 @@ static const NSString *kJwtKey = @"jwt";
message = [[request contentAsString] objectFromJSONString];
username = [message objectForKey: @"userName"];
domain = [message objectForKey: @"domain"];
if ([[SOGoSystemDefaults sharedSystemDefaults]
isPasswordRecoveryEnabled]) {
if ([[SOGoSystemDefaults sharedSystemDefaults] isPasswordRecoveryEnabled]) {
// If no domain, try to retrieve domain from username
if (nil != domain && domain != [NSNull null]) {
domainName = domain;
@@ -1099,8 +1454,9 @@ static const NSString *kJwtKey = @"jwt";
- (BOOL) hasUrlCreateAccount
{
return ([[SOGoSystemDefaults sharedSystemDefaults]
urlCreateAccount] != nil);
NSString *url;
url = [[SOGoSystemDefaults sharedSystemDefaults] urlCreateAccount];
return (url != nil && [url length] > 0);
}
- (NSString *) urlCreateAccount
+28 -7
View File
@@ -32,6 +32,7 @@
#import <SOGo/SOGoCache.h>
#import <SOGo/SOGoCASSession.h>
#import <SOGo/SOGoOpenIdSession.h>
#if defined(SAML2_CONFIG)
#import <SOGo/SOGoSAML2Session.h>
#endif
@@ -419,18 +420,38 @@
- (NSString *) _logoutRedirectURL
{
NSString *redirectURL;
NSString *redirectURL, *login, *loginDomain, *authType;
SOGoSystemDefaults *sd;
id container;
NSRange r;
login = [[context activeUser] login];
r = [login rangeOfString: @"@"];
if (r.location != NSNotFound)
loginDomain = [login substringFromIndex: r.location+1];
else
loginDomain = nil;
sd = [SOGoSystemDefaults sharedSystemDefaults];
if ([[sd authenticationType] isEqualToString: @"cas"])
{
redirectURL = [SOGoCASSession CASURLWithAction: @"logout"
andParameters: nil];
}
if(loginDomain && [sd doesLoginTypeByDomain])
authType = [sd getLoginTypeForDomain: loginDomain];
else
authType = [sd authenticationType];
if ([authType isEqualToString: @"cas"])
{
redirectURL = [SOGoCASSession CASURLWithAction: @"logout"
andParameters: nil];
}
else if ([authType isEqualToString: @"openid"])
{
SOGoOpenIdSession* session;
session = [SOGoOpenIdSession OpenIdSession: loginDomain];
redirectURL = [session logoutUrl];
}
#if defined(SAML2_CONFIG)
else if ([[sd authenticationType] isEqualToString: @"saml2"])
else if ([authType isEqualToString: @"saml2"])
{
NSString *username, *password, *domain, *value;
SOGoSAML2Session *saml2Session;
+10
View File
@@ -168,6 +168,16 @@
pageName = "SOGoRootPage";
actionName = "connect";
};
connectName = {
protectedBy = "<public>";
pageName = "SOGoRootPage";
actionName = "connectName";
};
openid_redirect = {
protectedBy = "<public>";
pageName = "SOGoRootPage";
actionName = "openIdRedirect";
};
changePassword = {
protectedBy = "<public>";
pageName = "SOGoRootPage";
+8
View File
@@ -147,6 +147,7 @@ static SoProduct *preferencesProduct = nil;
NSMutableDictionary *values, *account, *vacation;
SOGoUserDefaults *defaults;
SOGoDomainDefaults *domainDefaults;
SOGoSystemDefaults *sd;
NSMutableArray *accounts;
NSDictionary *calendarCategoryLabels, *contactsCategoriesLabels, *vacationOptions;
@@ -333,6 +334,13 @@ static SoProduct *preferencesProduct = nil;
[defaults setCalendarCategoriesColors: colors];
}
}
// Add the jisti link if needed
sd = [SOGoSystemDefaults sharedSystemDefaults];
if([sd isCalendarJitsiLinkEnabled])
{
if (![[defaults source] objectForKey: @"SOGoCalendarJitsiBaseUrl"])
[[defaults source] setObject: [domainDefaults calendarJistiBaseUrl] forKey: @"SOGoCalendarJitsiBaseUrl"];
}
//
// Default Contacts preferences
+6 -2
View File
@@ -1000,12 +1000,16 @@ static NSArray *reminderValues = nil;
//
- (NSArray *) daysBetweenResponsesList
{
static NSArray *daysBetweenResponses = nil;
static NSMutableArray *daysBetweenResponses = nil;
if (!daysBetweenResponses)
{
daysBetweenResponses = [NSArray arrayWithObjects: @"1", @"2", @"3",
daysBetweenResponses = [NSMutableArray arrayWithObjects: @"1", @"2", @"3",
@"5", @"7", @"14", @"21", @"30", nil];
if ([[user domainDefaults] vacationAllowZeroDays])
{
[daysBetweenResponses insertObject:@"0" atIndex:0];
}
[daysBetweenResponses retain];
}
@@ -117,6 +117,7 @@
"Save and Close" = "Save and Close";
"Close" = "Close";
"Invite Attendees" = "Invite Attendees";
"Create Jitsi Meeting" = "Create Jitsi Meeting";
"Attach" = "Attach";
"Update" = "Update";
"Cancel" = "Cancel";
@@ -117,6 +117,7 @@
"Save and Close" = "Enregistrer et fermer";
"Close" = "Fermer";
"Invite Attendees" = "Participants";
"Create Jitsi Meeting" = "Créer Une Réunion Jitsi";
"Attach" = "Joindre";
"Update" = "Mettre à jour";
"Cancel" = "Annuler";
+8
View File
@@ -517,7 +517,15 @@
@interface UIxAppointmentEditorTemplate : UIxComponentEditorTemplate
@end
@implementation UIxAppointmentEditorTemplate
- (BOOL) showJitsiLinkCreation
{
SOGoSystemDefaults *sd;
sd = [SOGoSystemDefaults sharedSystemDefaults];
return [sd isCalendarJitsiLinkEnabled];
}
@end
/* Task Editor */
+318 -203
View File
@@ -12,6 +12,7 @@
<script type="text/javascript">
var cookieUsername = <var:string var:value="cookieUsername.doubleQuotedString" const:escapeHTML="NO"/>;
var language = '<var:string var:value="language" const:escapeHTML="NO"/>';
var loginHint = '<var:string var:value="getLoginHint" const:escapeHTML="NO"/>'
</script>
<!--
@@ -44,116 +45,121 @@
</div>
</var:if>
</div>
<div class="sg-login md-default-theme md-bg md-accent" flex-gt-md="50">
<div id="login" class="sg-login-content md-padding">
<form name="loginForm" layout="column"
ng-cloak="ng-cloak"
ng-submit="app.login()">
<var:if condition="hasLoginSuffix">
<input type="hidden" ng-model="app.creds.loginSuffix" var:value="loginSuffix"/>
</var:if>
<div ng-if="!app.loginState">
<md-input-container class="md-block">
<label><var:string label:value="Username"/></label>
<md-icon>person</md-icon>
<input autocorrect="off" autocapitalize="off" type="text" ng-model="app.creds.username" ng-required="true" ng-change="app.usernameChanged()" ng-blur="app.retrievePasswordRecoveryEnabled()" />
</md-input-container>
<md-input-container class="md-block">
<label><var:string label:value="Password"/></label>
<md-icon>vpn_key</md-icon>
<input id="passwordField" type="password" ng-model="app.creds.password" ng-required="true"/>
<md-icon id="password-visibility-icon" ng-click="app.changePasswordVisibility()">visibility</md-icon>
</md-input-container>
<var:if condition="doFullLogin">
<div id="login" class="sg-login-content md-padding">
<form name="loginForm" layout="column"
ng-cloak="ng-cloak"
ng-submit="app.login()">
<var:if condition="hasLoginSuffix">
<input type="hidden" ng-model="app.creds.loginSuffix" var:value="loginSuffix"/>
</var:if>
<div ng-if="!app.loginState">
<!-- LANGUAGES SELECT -->
<div layout="row" layout-align="start end">
<md-icon>language</md-icon>
<md-input-container class="md-flex">
<label><var:string label:value="choose"/></label>
<md-select ng-model="app.creds.language"
var:placeholder="localizedLanguage"
ng-change="app.changeLanguage($event)">
<var:foreach list="languages" item="item">
<md-option var:value="item">
<var:string value="languageText"/>
</md-option>
</var:foreach>
</md-select>
<md-input-container class="md-block">
<label><var:string label:value="Username"/></label>
<md-icon>person</md-icon>
<input autocorrect="off" autocapitalize="off" type="text" ng-model="app.creds.username" ng-required="true" ng-change="app.usernameChanged()" ng-blur="app.retrievePasswordRecoveryEnabled()" />
</md-input-container>
</div>
<!-- DOMAINS SELECT -->
<var:if condition="hasLoginDomains">
<md-input-container class="md-block">
<label><var:string label:value="Password"/></label>
<md-icon>vpn_key</md-icon>
<input id="passwordField" type="password" ng-model="app.creds.password" ng-required="true"/>
<md-icon id="password-visibility-icon" ng-click="app.changePasswordVisibility()">visibility</md-icon>
</md-input-container>
<!-- LANGUAGES SELECT -->
<div layout="row" layout-align="start end">
<md-icon>domain</md-icon>
<md-input-container class="md-flex">
<md-select class="md-flex" ng-model="app.creds.domain" label:placeholder="choose" ng-change="app.retrievePasswordRecoveryEnabled()">
<var:foreach list="loginDomains" item="item">
<md-option var:value="item">
<var:string value="item"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
</div>
</var:if>
<div layout="row" layout-align="center center">
<md-switch class="md-accent md-hue-2"
ng-model="app.creds.rememberLogin"
label:arial-label="Remember username">
<var:string label:value="Remember username"/>
</md-switch>
</div>
<var:if condition="hasUrlCreateAccount">
<div layout="row" layout-align="center center">
<a var:href="urlCreateAccount" target="_blank" class="create-account-link"><var:string label:value="Create an account"/></a>
<md-icon>language</md-icon>
<md-input-container class="md-flex">
<label><var:string label:value="choose"/></label>
<md-select ng-model="app.creds.language"
var:placeholder="localizedLanguage"
ng-change="app.changeLanguage($event)">
<var:foreach list="languages" item="item">
<md-option var:value="item">
<var:string value="languageText"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
</div>
</var:if>
</div>
<!-- Password recovery -->
<div layout="row" layout-align="center center" ng-if="app.passwordRecovery.passwordRecoveryEnabled">
<div ng-if="app.showLogin">
<a href="#" ng-click="app.passwordRecoveryInfo()" sg-ripple-click="loginContent" class="password-lost-link"><var:string label:value="Password lost"/></a>
<!-- DOMAINS SELECT -->
<var:if condition="hasLoginDomains">
<div layout="row" layout-align="start end">
<md-icon>domain</md-icon>
<md-input-container class="md-flex">
<md-select class="md-flex" ng-model="app.creds.domain" label:placeholder="choose" ng-change="app.retrievePasswordRecoveryEnabled()">
<var:foreach list="loginDomains" item="item">
<md-option var:value="item">
<var:string value="item"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
</div>
</var:if>
<div layout="row" layout-align="center center">
<md-switch class="md-accent md-hue-2"
ng-model="app.creds.rememberLogin"
label:arial-label="Remember username">
<var:string label:value="Remember username"/>
</md-switch>
</div>
<var:if condition="hasUrlCreateAccount">
<div layout="row" layout-align="center center">
<a var:href="urlCreateAccount" target="_blank" class="create-account-link"><var:string label:value="Create an account"/></a>
</div>
</var:if>
</div>
</div>
<!-- CONNECT BUTTON -->
<div layout="row" layout-align="space-between center" ng-if="!app.loginState">
<md-button class="md-icon-button"
label:aria-label="About"
ng-click="app.showAbout()">
<md-icon>info</md-icon>
</md-button>
<div>
<md-button class="md-fab md-accent md-hue-2" type="submit"
label:aria-label="Connect"
ng-if="!app.loginState"
ng-disabled="loginForm.$invalid"
sg-ripple-click="loginContent">
<md-icon>arrow_forward</md-icon>
<!-- Password recovery -->
<div layout="row" layout-align="center center" ng-if="app.passwordRecovery.passwordRecoveryEnabled">
<div ng-if="app.showLogin">
<a href="#" ng-click="app.passwordRecoveryInfo()" sg-ripple-click="loginContent" class="password-lost-link"><var:string label:value="Password lost"/></a>
</div>
</div>
<!-- CONNECT BUTTON -->
<div layout="row" layout-align="space-between center" ng-if="!app.loginState">
<md-button class="md-icon-button"
label:aria-label="About"
ng-click="app.showAbout()">
<md-icon>info</md-icon>
</md-button>
<div>
<md-button class="md-fab md-accent md-hue-2" type="submit"
label:aria-label="Connect"
ng-if="!app.loginState"
ng-disabled="loginForm.$invalid"
sg-ripple-click="loginContent">
<md-icon>arrow_forward</md-icon>
</md-button>
</div>
</div>
</div>
<sg-ripple class="md-default-theme md-accent md-bg"
ng-class="{ 'md-warn': app.loginState == 'error' }"><!-- ripple background --></sg-ripple>
<sg-ripple-content class="md-flex ng-hide"
layout="column" layout-align="center center" layout-fill="layout-fill"
ng-switch="app.loginState">
<sg-ripple class="md-default-theme md-accent md-bg"
ng-class="{ 'md-warn': app.loginState == 'error' }"><!-- ripple background --></sg-ripple>
<sg-ripple-content class="md-flex ng-hide"
layout="column" layout-align="center center" layout-fill="layout-fill"
ng-switch="app.loginState">
<!-- Authenticating -->
<div layout="column" layout-align="center center"
ng-switch-when="authenticating">
<md-progress-circular class="md-hue-1"
md-mode="indeterminate"
md-diameter="32"><!-- mailbox loading progress --></md-progress-circular>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
<var:string label:value="Authenticating"/>
<!-- Authenticating -->
<div layout="column" layout-align="center center"
ng-switch-when="authenticating">
<md-progress-circular class="md-hue-1"
md-mode="indeterminate"
md-diameter="32"><!-- mailbox loading progress --></md-progress-circular>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
<var:string label:value="Authenticating"/>
</div>
</div>
</div>
<var:if condition="isTotpEnabled">
<!-- TOTP Code -->
@@ -163,7 +169,7 @@
<md-input-container class="md-block">
<label><var:string label:value="Verification Code"/></label>
<md-icon>lock</md-icon>
<input type="text"
<input type="text" inputmode="numeric" autocomplete="off"
ng-pattern="app.verificationCodePattern"
ng-model="app.creds.verificationCode"
ng-required="app.loginState == 'totpcode'"
@@ -258,126 +264,235 @@
</div>
</div>
<!-- Password policy: Grace period -->
<div layout="row" layout-align="center center" layout-fill="layout-fill"
ng-switch-when="passwordwillexpire">
<div layout="column" layout-align="center center" flex-xs="flex-xs" flex-gt-xs="50">
<md-icon class="md-accent md-hue-1 sg-icon--large">warning</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="app.cn">
<var:string label:value="Welcome"/> {{app.cn}}
</div>
<div class="md-padding" layout="row" layout-align="start center">
<md-icon>priority_high</md-icon>
<div class="md-padding">{{app.errorMessage}}</div>
</div>
<div layout="row" layout-align="end center">
<md-button
ng-click="app.loginState = 'passwordexpired'"><var:string label:value="Change your Password"/></md-button>
<md-button
ng-click="app.continueLogin()"
sg-ripple-click="loginContent"><var:string label:value="Continue"/></md-button>
</div>
</div>
</div>
<!-- Password recovery -->
<var:if condition="hasPasswordRecovery">
<div layout="column" layout-align="center center"
ng-switch-when="passwordrecovery">
<md-icon class="md-accent md-hue-1 sg-icon--large">vpn_key</md-icon>
<div flex="100">
<div layout="row" layout-xs="column" class="md-padding" layout-align="center center">
<div ng-if="app.passwordRecovery.showLoader">
<md-progress-circular class="md-hue-1"
md-mode="indeterminate"
md-diameter="32"><!-- password recovery progress --></md-progress-circular>
</div>
<div ng-if="'SecretQuestion' === app.passwordRecovery.passwordRecoveryMode">
<div ng-if="!app.passwordRecovery.showLoader">
{{ app.passwordRecovery.passwordRecoveryQuestion }}
<md-input-container class="md-block">
<label><var:string label:value="Answer"/></label>
<input autocorrect="off" autocapitalize="off" type="text" ng-model="app.passwordRecovery.passwordRecoveryQuestionAnswer" />
</md-input-container>
</div>
</div>
<div ng-if="'SecondaryEmail' === app.passwordRecovery.passwordRecoveryMode">
<div ng-if="!app.passwordRecovery.showLoader">
{{ app.passwordRecovery.passwordRecoverySecondaryEmailText }}
</div>
</div>
<!-- Password policy: Grace period -->
<div layout="row" layout-align="center center" layout-fill="layout-fill"
ng-switch-when="passwordwillexpire">
<div layout="column" layout-align="center center" flex-xs="flex-xs" flex-gt-xs="50">
<md-icon class="md-accent md-hue-1 sg-icon--large">warning</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="app.cn">
<var:string label:value="Welcome"/> {{app.cn}}
</div>
<div layout="row" layout-align="end center" ng-if="!app.passwordRecovery.showLoader">
<md-button ng-click="app.passwordRecoveryAbort()" type="button" >
<var:string label:value="Back"/>
</md-button>
<div ng-if="'SecretQuestion' === app.passwordRecovery.passwordRecoveryMode">
<md-button ng-click="app.passwordRecoveryCheck()" type="button" >
<var:string label:value="Next"/>
</md-button>
</div>
<div ng-if="'SecondaryEmail' === app.passwordRecovery.passwordRecoveryMode">
<md-button ng-click="app.passwordRecoveryEmail()" type="button" >
<var:string label:value="Next"/>
</md-button>
</div>
</div>
</div>
</div>
<div layout="column" layout-align="center center"
ng-switch-when="sendrecoverymail">
<md-icon class="md-accent md-hue-1 sg-icon--large">local_shipping</md-icon>
<div flex="100">
<div layout="row" layout-xs="column" class="md-padding">
<div ng-if="'SecondaryEmail' === app.passwordRecovery.passwordRecoveryMode">
<var:string label:value="A password reset link has been sent, please check your recovery e-mail mailbox and click on the link"/>
</div>
<div class="md-padding" layout="row" layout-align="start center">
<md-icon>priority_high</md-icon>
<div class="md-padding">{{app.errorMessage}}</div>
</div>
<div layout="row" layout-align="end center">
<md-button ng-click="app.passwordRecoveryAbort()" type="button" >
<var:string label:value="Back"/>
</md-button>
<md-button
ng-click="app.loginState = 'passwordexpired'"><var:string label:value="Change your Password"/></md-button>
<md-button
ng-click="app.continueLogin()"
sg-ripple-click="loginContent"><var:string label:value="Continue"/></md-button>
</div>
</div>
</div>
</var:if>
<!-- Logged in -->
<div layout="column" layout-align="center center"
ng-switch-when="logged">
<md-icon class="md-accent md-hue-1 sg-icon--large">done</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
<var:string label:value="Welcome"/> {{app.cn}}
<!-- Password recovery -->
<var:if condition="hasPasswordRecovery">
<div layout="column" layout-align="center center"
ng-switch-when="passwordrecovery">
<md-icon class="md-accent md-hue-1 sg-icon--large">vpn_key</md-icon>
<div flex="100">
<div layout="row" layout-xs="column" class="md-padding" layout-align="center center">
<div ng-if="app.passwordRecovery.showLoader">
<md-progress-circular class="md-hue-1"
md-mode="indeterminate"
md-diameter="32"><!-- password recovery progress --></md-progress-circular>
</div>
<div ng-if="'SecretQuestion' === app.passwordRecovery.passwordRecoveryMode">
<div ng-if="!app.passwordRecovery.showLoader">
{{ app.passwordRecovery.passwordRecoveryQuestion }}
<md-input-container class="md-block">
<label><var:string label:value="Answer"/></label>
<input autocorrect="off" autocapitalize="off" type="text" ng-model="app.passwordRecovery.passwordRecoveryQuestionAnswer" />
</md-input-container>
</div>
</div>
<div ng-if="'SecondaryEmail' === app.passwordRecovery.passwordRecoveryMode">
<div ng-if="!app.passwordRecovery.showLoader">
{{ app.passwordRecovery.passwordRecoverySecondaryEmailText }}
</div>
</div>
</div>
<div layout="row" layout-align="end center" ng-if="!app.passwordRecovery.showLoader">
<md-button ng-click="app.passwordRecoveryAbort()" type="button" >
<var:string label:value="Back"/>
</md-button>
<div ng-if="'SecretQuestion' === app.passwordRecovery.passwordRecoveryMode">
<md-button ng-click="app.passwordRecoveryCheck()" type="button" >
<var:string label:value="Next"/>
</md-button>
</div>
<div ng-if="'SecondaryEmail' === app.passwordRecovery.passwordRecoveryMode">
<md-button ng-click="app.passwordRecoveryEmail()" type="button" >
<var:string label:value="Next"/>
</md-button>
</div>
</div>
</div>
</div>
<div layout="column" layout-align="center center"
ng-switch-when="sendrecoverymail">
<md-icon class="md-accent md-hue-1 sg-icon--large">local_shipping</md-icon>
<div flex="100">
<div layout="row" layout-xs="column" class="md-padding">
<div ng-if="'SecondaryEmail' === app.passwordRecovery.passwordRecoveryMode">
<var:string label:value="A password reset link has been sent, please check your recovery e-mail mailbox and click on the link"/>
</div>
</div>
<div layout="row" layout-align="end center">
<md-button ng-click="app.passwordRecoveryAbort()" type="button" >
<var:string label:value="Back"/>
</md-button>
</div>
</div>
</div>
</var:if>
<!-- Logged in -->
<div layout="column" layout-align="center center"
ng-switch-when="logged">
<md-icon class="md-accent md-hue-1 sg-icon--large">done</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
<var:string label:value="Welcome"/> {{app.cn}}
</div>
</div>
</div>
<div layout="column" layout-align="center center"
ng-switch-when="message">
<md-icon class="md-accent md-hue-1 sg-icon--large">done</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
{{app.errorMessage}}
<div layout="column" layout-align="center center"
ng-switch-when="message">
<md-icon class="md-accent md-hue-1 sg-icon--large">done</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
{{app.errorMessage}}
</div>
<md-button
ng-click="app.continueLogin()"
sg-ripple-click="loginContent"><var:string label:value="Continue"/></md-button>
</div>
<md-button
ng-click="app.continueLogin()"
sg-ripple-click="loginContent"><var:string label:value="Continue"/></md-button>
</div>
<!-- Error -->
<div layout="column" layout-align="center center"
ng-switch-when="error">
<md-icon class="md-accent md-hue-1 sg-icon--large">error</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
{{app.errorMessage}}
<!-- Error -->
<div layout="column" layout-align="center center"
ng-switch-when="error">
<md-icon class="md-accent md-hue-1 sg-icon--large">error</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
{{app.errorMessage}}
</div>
<md-button
ng-click="app.restoreLogin()"
sg-ripple-click="loginContent"><var:string label:value="Retry"/></md-button>
</div>
<md-button
ng-click="app.restoreLogin()"
sg-ripple-click="loginContent"><var:string label:value="Retry"/></md-button>
</div>
</sg-ripple-content>
</form>
</sg-ripple-content>
</form>
</div>
</div>
</var:if>
<var:if condition="doPartialLogin">
<div id="login" class="sg-login-content md-padding">
<form name="loginForm" layout="column"
ng-cloak="ng-cloak"
ng-submit="app.loginName()">
<div ng-if="!app.loginState">
<md-input-container class="md-block">
<label><var:string label:value="Username"/></label>
<md-icon>person</md-icon>
<input autocorrect="off" autocapitalize="off" type="text" ng-model="app.creds.username" ng-required="true" ng-change="app.usernameChanged()" ng-blur="app.retrievePasswordRecoveryEnabled()" />
</md-input-container>
<!-- LANGUAGES SELECT -->
<div layout="row" layout-align="start end">
<md-icon>language</md-icon>
<md-input-container class="md-flex">
<label><var:string label:value="choose"/></label>
<md-select ng-model="app.creds.language"
var:placeholder="localizedLanguage"
ng-change="app.changeLanguage($event)">
<var:foreach list="languages" item="item">
<md-option var:value="item">
<var:string value="languageText"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
</div>
<var:if condition="hasUrlCreateAccount">
<div layout="row" layout-align="center center">
<a var:href="urlCreateAccount" target="_blank" class="create-account-link"><var:string label:value="Create an account"/></a>
</div>
</var:if>
</div>
<!-- CONNECT BUTTON -->
<div layout="row" layout-align="space-between center" ng-if="!app.loginState">
<md-button class="md-icon-button"
label:aria-label="About"
ng-click="app.showAbout()">
<md-icon>info</md-icon>
</md-button>
<div>
<md-button class="md-fab md-accent md-hue-2" type="submit"
label:aria-label="Connect"
ng-if="!app.loginState"
ng-disabled="loginForm.$invalid"
sg-ripple-click="loginContent">
<md-icon>arrow_forward</md-icon>
</md-button>
</div>
</div>
<sg-ripple class="md-default-theme md-accent md-bg"
ng-class="{ 'md-warn': app.loginState == 'error' }"><!-- ripple background --></sg-ripple>
<sg-ripple-content class="md-flex ng-hide"
layout="column" layout-align="center center" layout-fill="layout-fill"
ng-switch="app.loginState">
<!-- Authenticating -->
<div layout="column" layout-align="center center"
ng-switch-when="authenticating">
<md-progress-circular class="md-hue-1"
md-mode="indeterminate"
md-diameter="32"><!-- mailbox loading progress --></md-progress-circular>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
<var:string label:value="Authenticating"/>
</div>
</div>
<!-- Logged in -->
<div layout="column" layout-align="center center"
ng-switch-when="logged">
<md-icon class="md-accent md-hue-1 sg-icon--large">done</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
<var:string label:value="Welcome"/> {{app.cn}}
</div>
</div>
<div layout="column" layout-align="center center"
ng-switch-when="message">
<md-icon class="md-accent md-hue-1 sg-icon--large">done</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
{{app.errorMessage}}
</div>
<md-button
ng-click="app.continueLogin()"
sg-ripple-click="loginContent"><var:string label:value="Continue"/></md-button>
</div>
<!-- Error -->
<div layout="column" layout-align="center center"
ng-switch-when="error">
<md-icon class="md-accent md-hue-1 sg-icon--large">error</md-icon>
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding">
{{app.errorMessage}}
</div>
<md-button
ng-click="app.restoreLogin()"
sg-ripple-click="loginContent"><var:string label:value="Retry"/></md-button>
</div>
</sg-ripple-content>
</form>
</div>
</var:if>
</div>
</div>
</md-content>
@@ -1175,7 +1175,12 @@
ng-model="app.preferences.defaults.Vacation.daysBetweenResponse">
<var:foreach list="daysBetweenResponsesList" item="item">
<md-option var:value="item">
<var:string value="item"/>
<var:if condition="item" const:value="0">
<i><var:string label:value="Always send vacation message response"/></i>
</var:if>
<var:if condition="item" const:value="0" const:negate="YES">
<var:string value="item"/>
</var:if>
</md-option>
</var:foreach>
</md-select>
@@ -1499,4 +1504,4 @@
</script>
</var:component>
</var:component>
@@ -120,6 +120,19 @@
label:aria-label="Send Appointment Notifications">
<var:string label:value="Send Appointment Notifications"/>
</md-checkbox>
<!-- create jitsi link-->
<var:if condition="showJitsiLinkCreation">
<div layout="row" ng-if="!editor.component.hasJitsiUrl()" layout-align="start center">
<md-button class="md-icon-button" type="button" ng-click="editor.addJitsiUrl($event)">
<md-icon>add_circle</md-icon>
</md-button>
<label class="button-label">
<var:string label:value="Create Jitsi meeting"/>
</label>
</div>
</var:if>
<!-- attach urls -->
<div ng-repeat="attach in editor.component.attachUrls">
<div layout="row" layout-align="start center">
+1 -1
View File
@@ -1,2 +1,2 @@
@charset "UTF-8";.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.sg-hide{opacity:0}@-moz-document url-prefix(){[layout-fill]{margin:0;width:100%;min-height:100%;height:100%}}[flex-order]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="-20"]{-webkit-box-ordinal-group:-19;-webkit-order:-20;order:-20}[flex-order="-19"]{-webkit-box-ordinal-group:-18;-webkit-order:-19;order:-19}[flex-order="-18"]{-webkit-box-ordinal-group:-17;-webkit-order:-18;order:-18}[flex-order="-17"]{-webkit-box-ordinal-group:-16;-webkit-order:-17;order:-17}[flex-order="-16"]{-webkit-box-ordinal-group:-15;-webkit-order:-16;order:-16}[flex-order="-15"]{-webkit-box-ordinal-group:-14;-webkit-order:-15;order:-15}[flex-order="-14"]{-webkit-box-ordinal-group:-13;-webkit-order:-14;order:-14}[flex-order="-13"]{-webkit-box-ordinal-group:-12;-webkit-order:-13;order:-13}[flex-order="-12"]{-webkit-box-ordinal-group:-11;-webkit-order:-12;order:-12}[flex-order="-11"]{-webkit-box-ordinal-group:-10;-webkit-order:-11;order:-11}[flex-order="-10"]{-webkit-box-ordinal-group:-9;-webkit-order:-10;order:-10}[flex-order="-9"]{-webkit-box-ordinal-group:-8;-webkit-order:-9;order:-9}[flex-order="-8"]{-webkit-box-ordinal-group:-7;-webkit-order:-8;order:-8}[flex-order="-7"]{-webkit-box-ordinal-group:-6;-webkit-order:-7;order:-7}[flex-order="-6"]{-webkit-box-ordinal-group:-5;-webkit-order:-6;order:-6}[flex-order="-5"]{-webkit-box-ordinal-group:-4;-webkit-order:-5;order:-5}[flex-order="-4"]{-webkit-box-ordinal-group:-3;-webkit-order:-4;order:-4}[flex-order="-3"]{-webkit-box-ordinal-group:-2;-webkit-order:-3;order:-3}[flex-order="-2"]{-webkit-box-ordinal-group:-1;-webkit-order:-2;order:-2}[flex-order="-1"]{-webkit-box-ordinal-group:0;-webkit-order:-1;order:-1}[flex-order="0"]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="1"]{-webkit-box-ordinal-group:2;-webkit-order:1;order:1}[flex-order="2"]{-webkit-box-ordinal-group:3;-webkit-order:2;order:2}[flex-order="3"]{-webkit-box-ordinal-group:4;-webkit-order:3;order:3}[flex-order="4"]{-webkit-box-ordinal-group:5;-webkit-order:4;order:4}[flex-order="5"]{-webkit-box-ordinal-group:6;-webkit-order:5;order:5}[flex-order="6"]{-webkit-box-ordinal-group:7;-webkit-order:6;order:6}[flex-order="7"]{-webkit-box-ordinal-group:8;-webkit-order:7;order:7}[flex-order="8"]{-webkit-box-ordinal-group:9;-webkit-order:8;order:8}[flex-order="9"]{-webkit-box-ordinal-group:10;-webkit-order:9;order:9}[flex-order="10"]{-webkit-box-ordinal-group:11;-webkit-order:10;order:10}[flex-order="11"]{-webkit-box-ordinal-group:12;-webkit-order:11;order:11}[flex-order="12"]{-webkit-box-ordinal-group:13;-webkit-order:12;order:12}[flex-order="13"]{-webkit-box-ordinal-group:14;-webkit-order:13;order:13}[flex-order="14"]{-webkit-box-ordinal-group:15;-webkit-order:14;order:14}[flex-order="15"]{-webkit-box-ordinal-group:16;-webkit-order:15;order:15}[flex-order="16"]{-webkit-box-ordinal-group:17;-webkit-order:16;order:16}[flex-order="17"]{-webkit-box-ordinal-group:18;-webkit-order:17;order:17}[flex-order="18"]{-webkit-box-ordinal-group:19;-webkit-order:18;order:18}[flex-order="19"]{-webkit-box-ordinal-group:20;-webkit-order:19;order:19}[flex-order="20"]{-webkit-box-ordinal-group:21;-webkit-order:20;order:20}[flex-offset="0"]{margin-left:0}[flex-offset="5"]{margin-left:5%}[flex-offset="10"]{margin-left:10%}[flex-offset="15"]{margin-left:15%}[flex-offset="20"]{margin-left:20%}[flex-offset="25"]{margin-left:25%}[flex-offset="30"]{margin-left:30%}[flex-offset="35"]{margin-left:35%}[flex-offset="40"]{margin-left:40%}[flex-offset="45"]{margin-left:45%}[flex-offset="50"]{margin-left:50%}[flex-offset="55"]{margin-left:55%}[flex-offset="60"]{margin-left:60%}[flex-offset="65"]{margin-left:65%}[flex-offset="70"]{margin-left:70%}[flex-offset="75"]{margin-left:75%}[flex-offset="80"]{margin-left:80%}[flex-offset="85"]{margin-left:85%}[flex-offset="90"]{margin-left:90%}[flex-offset="95"]{margin-left:95%}[flex-offset="33"]{margin-left:33.3333333333%}[flex-offset="66"]{margin-left:66.6666666667%}[layout-align="start stretch"],[layout-align]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch}[layout-align="start center"],[layout-align="start end"],[layout-align="start start"],[layout-align="start stretch"],[layout-align=start]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}[layout-align="center center"],[layout-align="center end"],[layout-align="center start"],[layout-align="center stretch"],[layout-align=center]{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}[layout-align="end center"],[layout-align="end end"],[layout-align="end start"],[layout-align="end stretch"],[layout-align=end]{-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}[layout-align="spacLine truncated
@charset "UTF-8";.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.sg-hide{opacity:0}@-moz-document url-prefix(){[layout-fill]{margin:0;width:100%;min-height:100%;height:100%}}[flex-order]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="-20"]{-webkit-box-ordinal-group:-19;-webkit-order:-20;order:-20}[flex-order="-19"]{-webkit-box-ordinal-group:-18;-webkit-order:-19;order:-19}[flex-order="-18"]{-webkit-box-ordinal-group:-17;-webkit-order:-18;order:-18}[flex-order="-17"]{-webkit-box-ordinal-group:-16;-webkit-order:-17;order:-17}[flex-order="-16"]{-webkit-box-ordinal-group:-15;-webkit-order:-16;order:-16}[flex-order="-15"]{-webkit-box-ordinal-group:-14;-webkit-order:-15;order:-15}[flex-order="-14"]{-webkit-box-ordinal-group:-13;-webkit-order:-14;order:-14}[flex-order="-13"]{-webkit-box-ordinal-group:-12;-webkit-order:-13;order:-13}[flex-order="-12"]{-webkit-box-ordinal-group:-11;-webkit-order:-12;order:-12}[flex-order="-11"]{-webkit-box-ordinal-group:-10;-webkit-order:-11;order:-11}[flex-order="-10"]{-webkit-box-ordinal-group:-9;-webkit-order:-10;order:-10}[flex-order="-9"]{-webkit-box-ordinal-group:-8;-webkit-order:-9;order:-9}[flex-order="-8"]{-webkit-box-ordinal-group:-7;-webkit-order:-8;order:-8}[flex-order="-7"]{-webkit-box-ordinal-group:-6;-webkit-order:-7;order:-7}[flex-order="-6"]{-webkit-box-ordinal-group:-5;-webkit-order:-6;order:-6}[flex-order="-5"]{-webkit-box-ordinal-group:-4;-webkit-order:-5;order:-5}[flex-order="-4"]{-webkit-box-ordinal-group:-3;-webkit-order:-4;order:-4}[flex-order="-3"]{-webkit-box-ordinal-group:-2;-webkit-order:-3;order:-3}[flex-order="-2"]{-webkit-box-ordinal-group:-1;-webkit-order:-2;order:-2}[flex-order="-1"]{-webkit-box-ordinal-group:0;-webkit-order:-1;order:-1}[flex-order="0"]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="1"]{-webkit-box-ordinal-group:2;-webkit-order:1;order:1}[flex-order="2"]{-webkit-box-ordinal-group:3;-webkit-order:2;order:2}[flex-order="3"]{-webkit-box-ordinal-group:4;-webkit-order:3;order:3}[flex-order="4"]{-webkit-box-ordinal-group:5;-webkit-order:4;order:4}[flex-order="5"]{-webkit-box-ordinal-group:6;-webkit-order:5;order:5}[flex-order="6"]{-webkit-box-ordinal-group:7;-webkit-order:6;order:6}[flex-order="7"]{-webkit-box-ordinal-group:8;-webkit-order:7;order:7}[flex-order="8"]{-webkit-box-ordinal-group:9;-webkit-order:8;order:8}[flex-order="9"]{-webkit-box-ordinal-group:10;-webkit-order:9;order:9}[flex-order="10"]{-webkit-box-ordinal-group:11;-webkit-order:10;order:10}[flex-order="11"]{-webkit-box-ordinal-group:12;-webkit-order:11;order:11}[flex-order="12"]{-webkit-box-ordinal-group:13;-webkit-order:12;order:12}[flex-order="13"]{-webkit-box-ordinal-group:14;-webkit-order:13;order:13}[flex-order="14"]{-webkit-box-ordinal-group:15;-webkit-order:14;order:14}[flex-order="15"]{-webkit-box-ordinal-group:16;-webkit-order:15;order:15}[flex-order="16"]{-webkit-box-ordinal-group:17;-webkit-order:16;order:16}[flex-order="17"]{-webkit-box-ordinal-group:18;-webkit-order:17;order:17}[flex-order="18"]{-webkit-box-ordinal-group:19;-webkit-order:18;order:18}[flex-order="19"]{-webkit-box-ordinal-group:20;-webkit-order:19;order:19}[flex-order="20"]{-webkit-box-ordinal-group:21;-webkit-order:20;order:20}[flex-offset="0"]{margin-left:0}[flex-offset="5"]{margin-left:5%}[flex-offset="10"]{margin-left:10%}[flex-offset="15"]{margin-left:15%}[flex-offset="20"]{margin-left:20%}[flex-offset="25"]{margin-left:25%}[flex-offset="30"]{margin-left:30%}[flex-offset="35"]{margin-left:35%}[flex-offset="40"]{margin-left:40%}[flex-offset="45"]{margin-left:45%}[flex-offset="50"]{margin-left:50%}[flex-offset="55"]{margin-left:55%}[flex-offset="60"]{margin-left:60%}[flex-offset="65"]{margin-left:65%}[flex-offset="70"]{margin-left:70%}[flex-offset="75"]{margin-left:75%}[flex-offset="80"]{margin-left:80%}[flex-offset="85"]{margin-left:85%}[flex-offset="90"]{margin-left:90%}[flex-offset="95"]{margin-left:95%}[flex-offset="33"]{margin-left:33.3333333333%}[flex-offset="66"]{margin-left:66.6666666667%}[layout-align="start stretch"],[layout-align]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch}[layout-align="start center"],[layout-align="start end"],[layout-align="start start"],[layout-align="start stretch"],[layout-align=start]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}[layout-align="center center"],[layout-align="center end"],[layout-align="center start"],[layout-align="center stretch"],[layout-align=center]{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}[layout-align="end center"],[layout-align="end end"],[layout-align="end start"],[layout-align="end stretch"],[layout-align=end]{-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}[layout-align="spacLine truncated
/*# sourceMappingURL=styles.css.map */
+1 -1
View File
@@ -1 +1 @@
{"version":3,"sources":["css/styles.css"],"names":[],"mappings":"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 truncated
{"version":3,"sources":["css/styles.css"],"names":[],"mappings":"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 truncated
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"Common.js","sources":["Common/utils.js","Common/Common.app.js","Common/mdColors.app.js","Common/cssescape.filter.js","Common/decodeUri.filter.js","Common/encodeUri.filter.js","Common/ensureTarget.filter.js","Common/loc.filter.js","Common/range.filter.js","Common/txt2html.filter.js","Common/AclController.js","Common/navController.js","Common/Acl.service.js","Common/Authentication.service.js","Common/Dialog.service.js","Common/Gravatar.service.js","Common/Resource.service.js","Common/sgFocus.service.js","Common/sgHotkeys.service.js","Common/sgRippleClick.service.js","Common/User.service.js","Common/sgAutogrow.directive.js","Common/sgAvatarImage.directive.js","Common/sgBlockToggle.directive.js","Common/sgCheckmark.directive.js","Common/sgColorPicker.directive.js","Common/sgCompile.directive.js","Common/sgDatepickerReadonlyInput.directive.js","Common/sgDraggable.directive.js","Common/sgDroppable.directive.js","Common/sgEnter.directive.js","Common/sgEscape.directive.js","Common/sgFocus.directive.js","Common/sgFolderStylesheet.directive.js","Common/sgLabels.directive.js","Common/sgNoDirtyCheck.directive.js","Common/sgPlaceholder.directive.js","Common/sgQrCode.directive.js","Common/sgResetOnDisabled.directive.js","Common/sgRippleClick.directive.js","Common/sgSearch.directive.js","Common/sgSelectOnly.directive.js","Common/sgSubscribe.directive.js","Common/sgTimepicker.directive.js","Common/sgToggleGrid.directive.js"],"names":["l","i","j","key","arguments","value","args","labels","clabels","length","replace","m","val","parseFloat","isNaN","hexToRgb","hex","result","exec","r","parseInt","g","b","contrast","color","c","Math","pow","guid","S4","random","toString","substring","substr","toLowerCase","configure","$animateProvider","$logProvider","$compileProvider","$httpProvider","$mdThemingProvider","$mdAriaProvider","$qProvider","classNameFilter","definePalette","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastLightColors","contrastDarkColors","greyMap","extendPalette","1000","theme","primaryPalette","default","hue-1","hue-2","hue-3","accentPalette","backgroundPalette","registerStyles","join","window","DebugEnabled","debugEnabled","debugInfoEnabled","disableWarnings","errorOnUnhandledRejections","generateThemesOnDemand","interceptors","push","renewTicket","$window","$q","$timeout","$injector","response","deferred","defer","iframe","angular","element","UserFolderURL","on","$state","get","config","attempt","off","location","href","ApplicationBaseURL","current","reject","$http","then","resolve","finally","remove","document","body","appendChild","promise","AuthInterceptor","test","headers","Accept","data","usesCASAuthentication","usesSAML2Authentication","ErrorInterceptor","$rootScope","responseError","rejection","status","cookie","indexOf","recovered","quiet","$broadcast","module","isPopup","classList","contains","baseURL","resourcesURL","ResourcesURL","activeUser","param","settings","login","UserLogin","identification","UserIdentification","email","UserEmail","language","UserLanguage","folderURL","isSuperUser","IsSuperUser","path","calendar","UserCalendarPath","contacts","UserContactsPath","mail","UserMailPath","preferences","UserPreferencesPath","administration","UserAdministrationPath","help","HelpURL","logoff","UserLogoffPath","minimumSearchLength","isNumber","constant","selection","xs","gt-xs","sm","gt-sm","md","gt-md","lg","gt-lg","xl","print","toastPosition","factory","$inject","_$mdThemingProvider","runBlock","$interpolate","$document","$log","buildCssSelectors","selectors","fgDefault","bgDefault","bdrDefault","fgDefaultHue","bgDefaultHue","fgColor","bgColor","bdrColor","fgHue","bgHue","customSheet","style","head","querySelector","createElement","title","createTextNode","sheet","index","cssRules","deleteRule","addRule","fgInterpolate","bgInterpolate","themeName","paletteName","colorArray","hueName","context","palette","hue","insertRule","addBorderRule","bdrInterpolate","colorValue","forEach","_THEMES","_PALETTES","colors","primary","name","hues","run","cssEscape","CSS","escape","filter","decodeUri","decodeURIComponent","encodeUri","encodeURIComponent","ensureTarget","$sce","tree","find","attr","trustAs","html","n","res","txt2html","linkyFilter","text","String","rel","undefined","AclController","$mdDialog","Dialog","usersWithACL","User","folder","vm","this","selectUser","user","$event","target","parentNode","selectedUid","uid","selectedUser","inactive","$rights","users","userToAdd","searchText","folderClassName","isFunction","getClassName","templateName","getElementById","$isAnonymous","userFilter","$query","$filter","$acl","dry","closeModal","$resetUsersRights","hide","saveModal","$saveUsersRights","alert","confirmChange","confirmation","$confirmRights","showing","message","removeUser","$removeUser","addUser","$addUser","toggleAllRights","$toggleAllRights","hasNoRight","$hasNoRight","showRights","controller","navController",Line truncated
{"version":3,"file":"Common.js","sources":["Common/utils.js","Common/Common.app.js","Common/mdColors.app.js","Common/cssescape.filter.js","Common/decodeUri.filter.js","Common/encodeUri.filter.js","Common/ensureTarget.filter.js","Common/loc.filter.js","Common/range.filter.js","Common/txt2html.filter.js","Common/AclController.js","Common/navController.js","Common/Acl.service.js","Common/Authentication.service.js","Common/Dialog.service.js","Common/Gravatar.service.js","Common/Resource.service.js","Common/sgFocus.service.js","Common/sgHotkeys.service.js","Common/sgRippleClick.service.js","Common/User.service.js","Common/sgAutogrow.directive.js","Common/sgAvatarImage.directive.js","Common/sgBlockToggle.directive.js","Common/sgCheckmark.directive.js","Common/sgColorPicker.directive.js","Common/sgCompile.directive.js","Common/sgDatepickerReadonlyInput.directive.js","Common/sgDraggable.directive.js","Common/sgDroppable.directive.js","Common/sgEnter.directive.js","Common/sgEscape.directive.js","Common/sgFocus.directive.js","Common/sgFolderStylesheet.directive.js","Common/sgLabels.directive.js","Common/sgNoDirtyCheck.directive.js","Common/sgPlaceholder.directive.js","Common/sgQrCode.directive.js","Common/sgResetOnDisabled.directive.js","Common/sgRippleClick.directive.js","Common/sgSearch.directive.js","Common/sgSelectOnly.directive.js","Common/sgSubscribe.directive.js","Common/sgTimepicker.directive.js","Common/sgToggleGrid.directive.js"],"names":["l","i","j","key","arguments","value","args","labels","clabels","length","replace","m","val","parseFloat","isNaN","hexToRgb","hex","result","exec","r","parseInt","g","b","contrast","color","c","Math","pow","guid","S4","random","toString","substring","substr","toLowerCase","configure","$animateProvider","$logProvider","$compileProvider","$httpProvider","$mdThemingProvider","$mdAriaProvider","$qProvider","classNameFilter","definePalette","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastLightColors","contrastDarkColors","greyMap","extendPalette","1000","theme","primaryPalette","default","hue-1","hue-2","hue-3","accentPalette","backgroundPalette","registerStyles","join","window","DebugEnabled","debugEnabled","debugInfoEnabled","disableWarnings","errorOnUnhandledRejections","generateThemesOnDemand","interceptors","push","renewTicket","$window","$q","$timeout","$injector","response","deferred","defer","iframe","angular","element","UserFolderURL","on","$state","get","config","attempt","off","location","href","ApplicationBaseURL","current","reject","$http","then","resolve","finally","remove","document","body","appendChild","promise","AuthInterceptor","test","headers","Accept","data","usesCASAuthentication","usesSAML2Authentication","ErrorInterceptor","$rootScope","responseError","rejection","status","cookie","indexOf","recovered","quiet","$broadcast","module","isPopup","classList","contains","baseURL","resourcesURL","ResourcesURL","activeUser","param","settings","login","UserLogin","identification","UserIdentification","email","UserEmail","language","UserLanguage","folderURL","isSuperUser","IsSuperUser","path","calendar","UserCalendarPath","contacts","UserContactsPath","mail","UserMailPath","preferences","UserPreferencesPath","administration","UserAdministrationPath","help","HelpURL","logoff","UserLogoffPath","minimumSearchLength","isNumber","constant","selection","xs","gt-xs","sm","gt-sm","md","gt-md","lg","gt-lg","xl","print","toastPosition","factory","$inject","_$mdThemingProvider","runBlock","$interpolate","$document","$log","buildCssSelectors","selectors","fgDefault","bgDefault","bdrDefault","fgDefaultHue","bgDefaultHue","fgColor","bgColor","bdrColor","fgHue","bgHue","customSheet","style","head","querySelector","createElement","title","createTextNode","sheet","index","cssRules","deleteRule","addRule","fgInterpolate","bgInterpolate","themeName","paletteName","colorArray","hueName","context","palette","hue","insertRule","addBorderRule","bdrInterpolate","colorValue","forEach","_THEMES","_PALETTES","colors","primary","name","hues","run","cssEscape","CSS","escape","filter","decodeUri","decodeURIComponent","encodeUri","encodeURIComponent","ensureTarget","$sce","tree","find","attr","trustAs","html","n","res","txt2html","linkyFilter","text","String","rel","undefined","AclController","$mdDialog","Dialog","usersWithACL","User","folder","vm","this","selectUser","user","$event","target","parentNode","selectedUid","uid","selectedUser","inactive","$rights","users","userToAdd","searchText","folderClassName","isFunction","getClassName","templateName","getElementById","$isAnonymous","userFilter","$query","$filter","$acl","dry","closeModal","$resetUsersRights","hide","saveModal","$saveUsersRights","alert","confirmChange","confirmation","$confirmRights","showing","message","removeUser","$removeUser","addUser","$addUser","toggleAllRights","$toggleAllRights","hasNoRight","$hasNoRight","showRights","controller","navController",Line truncated
@@ -178,6 +178,45 @@
return d.promise;
}, // login: function(data) { ...
loginName: function(data) {
var d = $q.defer(),
username = data.username,
language;
if (data.language && data.language != 'WONoSelectionString') {
language = data.language;
}
$http({
method: 'POST',
url: '/SOGo/connectName?userName='+username,
// data: JSON.stringify({userName: username}),
data: {userName: username},
// headers: {
// //'Content-Type': undefined
// //'Content-Type': "application/x-www-form-urlencoded"
// 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8'
// }
}).then(function(response) {
var data = response.data;
// Make sure browser's cookies are enabled
if (navigator && !navigator.cookieEnabled) {
d.reject({error: l('cookiesNotEnabled')});
}
else {
if(data.redirect) {
//Redirection in case of openID
d.resolve({ url: data.redirect });
}
}
}, function(error) {
var response, perr, data = error.data;
d.reject(response);
});
return d.promise;
},
changePassword: function(userName, domain, newPassword, oldPassword, token) {
var d = $q.defer(),
xsrfCookie = $cookies.get('XSRF-TOKEN');
@@ -230,6 +230,7 @@
};
config = vm.config ? angular.merge(sgCkeditorConfig.config, vm.config) : sgCkeditorConfig.config;
config.licenseKey = "GPL";
if (!config.toolbar) {
config.toolbar = {
@@ -257,6 +258,27 @@
}
]
};
config.fontFamily = {
supportAllValues: true,
style: {
element: 'span',
attributes: {
style: 'font-family'
}
}
};
config.fontSize = {
options: ['10px', '12px', '14px', '16px', '18px', '20px', '24px'],
supportAllValues: true,
style: {
element: 'span',
attributes: {
style: 'font-size'
}
}
};
config.htmlEmbed = {
showPreviews: true
};
@@ -1 +1 @@
{"version":3,"file":"Mailer.services.js","sources":["Mailer/Account.service.js","Mailer/Mailbox.service.js","Mailer/Message.service.js","Mailer/sgImageGallery.service.js","Mailer/VirtualMailbox.service.js","Mailer/MailboxController.js","Mailer/MailboxesController.js","Mailer/MessageController.js","Mailer/MessageEditorController.js","Mailer/sgAccountSection.directive.js","Mailer/sgIMIP.directive.js","Mailer/sgMailboxListItem.directive.js","Mailer/sgMessageListItem.directive.js","Mailer/sgMessageListItemMain.directive.js","Mailer/sgZoomableImage.directive.js"],"names":["Account","futureAccountData","_this","this","then","angular","extend","_","forEach","identities","identity","element","fullName","email","full","signature","textSignature","map","contents","join","trim","$mailboxes","$Mailbox","$unwrapCollection","$q","when","mailboxes","collection","$factory","$timeout","$log","Settings","Resource","Preferences","Mailbox","Message","$$resource","activeUser","$Preferences","$Message","module","e","factory","$findAll","data","$accounts","fetch","o","i","id","refreshUnseenCount","folders","unseenCountFolders","fetchAllUnseenCountFolders","defaults","SOGoMailFetchAllUnseenCountFolders","refreshViewCheck","SOGoRefreshViewCheck","Error","account","$$flattenMailboxes","mailbox","push","includes","isDefined","unseenCount","post","$refreshUnseenCount","cancel","bind","timeInterval","prototype","getLength","$expanded","$flattenMailboxes","length","getItemAtIndex","index","expandedMailboxes","$getMailboxes","options","reload","$futureMailboxesData","$find","_visitForUnseencount","previousMailbox","find","previousMailboxes","children","all","_visitForExpanded","expandedFolders","indexOf","settings","Mail","ExpandedFolders","isString","fromJson","warn","_visit","allMailboxes","saveState","reduce","$getMailboxByType","type","_find","$getMailboxByPath","path","$newMailbox","name","toString","getTextSignature","$hasCertificate","security","hasCertificate","$certificate","$$certificate","reject","$removeCertificate","updateQuota","percent","description","maxQuota","Math","round","usedSpace","l","formatted","maxMessages","messagesCount","$quota","$newMessage","debug","JSON","stringify","undefined","accountId","mailboxPath","message","$absolutePath","asDraft","accountDefaults","AuxiliaryMailAccounts","alwaysSign","sign","alwaysEncrypt","encrypt","editable","isNew","mailto","isObject","$parseMailto","$addDelegate","user","deferred","defer","param","uid","delegates","resolve","users","status","promise","$removeDelegate","splice","$omit","deep","defaultIdentity","value","key","copy","isReadOnly","pick","isDefault","forceDefaultIdentity","futureMailboxData","$account","init","newMailboxData","create","$unwrap","$rootScope","Acl","PRELOAD","BATCH_DELETE_LIMIT","$$Acl","$query","sort","asc","selectedFolder","$refreshTimeout","$virtualMode","$virtualPath","$searchMode","SortingState","parseInt","constant","LOOKAHEAD","SIZE","createMailboxes","level","isSentFolder","isDraftsFolder","quotas","split","component","asCSSIdentifier","isUndefined","uidsMap","headers","$isLoading","$messages","$visibleMessages","$selectedMessages","$highlightWords","$id","$acl","threaded","$collapsedThreads","threadsCollapsed","$displayName","$isEditable","isEditable","$isSpecial","$icon","$isNoInferiors","isNoInferiors","$shadowData","selectFolder","setSearchMode","searchMode","$lastVisibleIndex","max","$loadMessage","selectedMessages","updateCache","filter","selected","selectedCount","$unselectMessages","isSelectedMessage","messageId","$selectedMessage","selectedMessage","$selectedMessageIndex","hasSelectedMessage","$filter","sortingAttributes","filters","action","labels","searchBy","searchInput","word","cleanedWord","toLowerCase","match","secondFilter","$flaggedOnly","$unseenOnly","$syncToken","syncToken","unseenOnly","flaggedOnly","keys","$filteredLabels","k","f","endIndex","uids","startIndex","loaded","subject","min","loading","futureHeadersData","$unwrapHeaders","flags","isNoSelect","isWritable","getClassName","base","$rename","findParent","parent","parentMailbox","$save","_updateChildren","child","replace","pathRE","oldPath","sibling","localeCompare","RegExp","$compact","$canFolderAs","$setFolderAs","$empty","capitalize","substring","$markAsRead","isread","getLabels","$labels","filteredByLabel","$flagMessages","messages","operation","msgUIDs","forwardMessages","saveSelectedMessages","selectedUIDs","download","exportFolder","filename","open","$delete","$_deleteMessages","firstIndex","forEachRight","selectedIndex","findIndex","updateVisibleMessages","$deleteMessages","batchSize","_deleteMessages","start","end","currentUids","slice","$markOrUnMarkMessagesAsJunk","method","$copyMessages","folder","$moveMessages","$move","parentPath","finally","save","response","error","$reset","Object","assign","childrenArray","collapsedThread","msg","first","collapsed","$broadcast","$futureMailboxData","headersFields","msgObject","hasNewMessages","$topIndex","deleted","jLine truncated
{"version":3,"file":"Mailer.services.js","sources":["Mailer/Account.service.js","Mailer/Mailbox.service.js","Mailer/Message.service.js","Mailer/sgImageGallery.service.js","Mailer/VirtualMailbox.service.js","Mailer/MailboxController.js","Mailer/MailboxesController.js","Mailer/MessageController.js","Mailer/MessageEditorController.js","Mailer/sgAccountSection.directive.js","Mailer/sgIMIP.directive.js","Mailer/sgMailboxListItem.directive.js","Mailer/sgMessageListItem.directive.js","Mailer/sgMessageListItemMain.directive.js","Mailer/sgZoomableImage.directive.js"],"names":["Account","futureAccountData","_this","this","then","angular","extend","_","forEach","identities","identity","element","fullName","email","full","signature","textSignature","map","contents","join","trim","$mailboxes","$Mailbox","$unwrapCollection","$q","when","mailboxes","collection","$factory","$timeout","$log","Settings","Resource","Preferences","Mailbox","Message","$$resource","activeUser","$Preferences","$Message","module","e","factory","$findAll","data","$accounts","fetch","o","i","id","refreshUnseenCount","folders","unseenCountFolders","fetchAllUnseenCountFolders","defaults","SOGoMailFetchAllUnseenCountFolders","refreshViewCheck","SOGoRefreshViewCheck","Error","account","$$flattenMailboxes","mailbox","push","includes","isDefined","unseenCount","post","$refreshUnseenCount","cancel","bind","timeInterval","prototype","getLength","$expanded","$flattenMailboxes","length","getItemAtIndex","index","expandedMailboxes","$getMailboxes","options","reload","$futureMailboxesData","$find","_visitForUnseencount","previousMailbox","find","previousMailboxes","children","all","_visitForExpanded","expandedFolders","indexOf","settings","Mail","ExpandedFolders","isString","fromJson","warn","_visit","allMailboxes","saveState","reduce","$getMailboxByType","type","_find","$getMailboxByPath","path","$newMailbox","name","toString","getTextSignature","$hasCertificate","security","hasCertificate","$certificate","$$certificate","reject","$removeCertificate","updateQuota","percent","description","maxQuota","Math","round","usedSpace","l","formatted","maxMessages","messagesCount","$quota","$newMessage","debug","JSON","stringify","undefined","accountId","mailboxPath","message","$absolutePath","asDraft","accountDefaults","AuxiliaryMailAccounts","alwaysSign","sign","alwaysEncrypt","encrypt","editable","isNew","mailto","isObject","$parseMailto","$addDelegate","user","deferred","defer","param","uid","delegates","resolve","users","status","promise","$removeDelegate","splice","$omit","deep","defaultIdentity","value","key","copy","isReadOnly","pick","isDefault","forceDefaultIdentity","futureMailboxData","$account","init","newMailboxData","create","$unwrap","$rootScope","Acl","PRELOAD","BATCH_DELETE_LIMIT","$$Acl","$query","sort","asc","selectedFolder","$refreshTimeout","$virtualMode","$virtualPath","$searchMode","SortingState","parseInt","constant","LOOKAHEAD","SIZE","createMailboxes","level","isSentFolder","isDraftsFolder","quotas","split","component","asCSSIdentifier","isUndefined","uidsMap","headers","$isLoading","$messages","$visibleMessages","$selectedMessages","$highlightWords","$id","$acl","threaded","$collapsedThreads","threadsCollapsed","$displayName","$isEditable","isEditable","$isSpecial","$icon","$isNoInferiors","isNoInferiors","$shadowData","selectFolder","setSearchMode","searchMode","$lastVisibleIndex","max","$loadMessage","selectedMessages","updateCache","filter","selected","selectedCount","$unselectMessages","isSelectedMessage","messageId","$selectedMessage","selectedMessage","$selectedMessageIndex","hasSelectedMessage","$filter","sortingAttributes","filters","action","labels","searchBy","searchInput","word","cleanedWord","toLowerCase","match","secondFilter","$flaggedOnly","$unseenOnly","$syncToken","syncToken","unseenOnly","flaggedOnly","keys","$filteredLabels","k","f","endIndex","uids","startIndex","loaded","subject","min","loading","futureHeadersData","$unwrapHeaders","flags","isNoSelect","isWritable","getClassName","base","$rename","findParent","parent","parentMailbox","$save","_updateChildren","child","replace","pathRE","oldPath","sibling","localeCompare","RegExp","$compact","$canFolderAs","$setFolderAs","$empty","capitalize","substring","$markAsRead","isread","getLabels","$labels","filteredByLabel","$flagMessages","messages","operation","msgUIDs","forwardMessages","saveSelectedMessages","selectedUIDs","download","exportFolder","filename","open","$delete","$_deleteMessages","firstIndex","forEachRight","selectedIndex","findIndex","updateVisibleMessages","$deleteMessages","batchSize","_deleteMessages","start","end","currentUids","slice","$markOrUnMarkMessagesAsJunk","method","$copyMessages","folder","$moveMessages","$move","parentPath","finally","save","response","error","$reset","Object","assign","childrenArray","collapsedThread","msg","first","collapsed","$broadcast","$futureMailboxData","headersFields","msgObject","hasNewMessages","$topIndex","deleted","jLine truncated
@@ -210,9 +210,7 @@
}
url = url.join('/');
popupWindow = $window.open(url, wId,
["width=680",
"height=520",
"resizable=1",
["resizable=1",
"scrollbars=1",
"toolbar=0",
"location=0",
+1 -1
View File
@@ -1,2 +1,2 @@
!function(){"use strict";angular.module("SOGo.MainUI",["SOGo.Common","SOGo.Authentication"]);function e(e,s,o,r,a,i,n,t,d,c){var w=this;this.$onInit=function(){this.creds={username:s.cookieUsername,password:null,domain:null,rememberLogin:angular.isDefined(s.cookieUsername)&&0<s.cookieUsername.length},/\blanguage=/.test(s.location.search)&&(this.creds.language=s.language),this.loginState=!1,this.verificationCodePattern="\\d{6}",this.passwords={newPassword:null,newPasswordConfirmation:null,oldPassword:null,visible:!1},this.passwordRecovery={passwordRecoveryEnabled:!1,passwordRecoveryQuestionKey:null,passwordRecoveryQuestion:null,passwordRecoveryMode:null,passwordRecoveryQuestionAnswer:null,passwordRecoveryToken:null,passwordRecoveryLinkTimer:null,passwordRecoverySecondaryEmailText:null,passwordRecoveryMailDomain:null,showLoader:!1},this.showLogin=!1,o(function(){w.showLogin=!0;var e=window.location.search;let s=new URLSearchParams(e).get("token");0<window.location.pathname.indexOf("passwordRecoveryEmail")&&s?3===(e=(s=s.replace(/\//g,"")).split(".")).length&&(w.passwordRecovery.passwordRecoveryToken=s,e=JSON.parse(atob(e[1])),w.creds.username=e.username,w.creds.domain=e.domain,w.passwordRecovery.passwordRecoveryToken=s,w.passwordRecovery.passwordRecoveryMode="SecondaryEmail",w.passwordRecovery.passwordRecoveryEnabled=!0,w.loginState="passwordchange",t("loginContent")):w.retrievePasswordRecoveryEnabled(),0<document.querySelectorAll("*:autofill").length&&document.querySelectorAll("*:autofill").forEach(e=>{e.parentElement.classList.add("md-input-has-value")})},100)},this.login=function(){return w.loginState="authenticating",i.login(w.creds).then(function(e){e.totpmissingkey?(w.loginState="totpcode",n("totpcode")):e.totpdisabled?(w.loginState="totpdisabled",w.cn=e.cn,w.url=e.url):(w.loginState="logged",w.cn=e.cn,w.url=e.url,o(function(){w.continueLogin()},1e3))},function(e){var s,o;w.loginState="error",e.error?w.errorMessage=e.error:0<e.grace?(w.loginState="passwordwillexpire",w.cn=e.cn,w.url=e.url,w.passwordPolicy=e.userPolicies||[],w.errorMessage=l("You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.",e.grace)):0<e.expire?(o=86400<e.expire?(s=Math.round(e.expire/86400),l("days")):3600<e.expire?(s=Math.round(e.expire/3600),l("hours")):60<e.expire?(s=Math.round(e.expire/60),l("minutes")):(s=e.expire,l("seconds")),w.loginState="passwordwillexpire",w.cn=e.cn,w.url=e.url,w.errorMessage=l("Your password is going to expire in %{0} %{1}.",s,o)):(e.passwordexpired&&2==e.passwordexpired||e.passwordexpired)&&(w.loginState="passwordchange",w.passwordPolicy=e.userPolicies||[],w.url=e.url,w.passwordexpired=e.passwordexpired)}),!1},this.restoreLogin=function(){"SecretQuestion"===w.passwordRecovery.passwordRecoveryMode?t("loginContent"):delete w.creds.verificationCode,w.passwordRecoveryAbort()},this.continueLogin=function(){s.location.href===w.url?s.location.reload(!0):s.location.href=w.url},this.showAbout=function(e){function s(e){this.closeDialog=function(){e.hide()}}a.show({targetEvent:e,templateUrl:"aboutBox.html",controller:s,controllerAs:"about"}),s.$inject=["$mdDialog"]},this.changeLanguage=function(e){s.location.href=ApplicationBaseURL+"login?language="+this.creds.language},this.canChangePassword=function(e){return this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword!=this.passwords.newPasswordConfirmation?(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!1),!1):(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!0),!!(this.passwords.newPassword&&0<this.passwords.newPassword.length&&this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword==this.passwords.newPasswordConfirmation&&(this.isInPasswordRecoveryMode()||!this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length||"passwordchange"==this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length)))},this.changePassword=function(){i.changePassword(this.creds.username,this.creds.domain,this.passwords.newPassword,this.passwords.oldPassword,this.passwordRecovery.passwordRecoveryToken).then(function(e){w.loginState="message",w.url=e.url,w.errorMessage=l("The password was changed successfully.")},function(e){c.show(c.simple().textContent(e).position(d.toastPosition).hideDelay(2e3))})},this.passwordRecoveryInfo=function(){w.loginState="passwordrecovery",w.passwordRecovery.showLoader=!0,i.passwordRecovery(this.creds.username,this.creds.domain).then(function(e){w.passwordRecovery.passwordRecoveryMode=e.mode,"SecretQuestion"===e.mode?(w.passwordRecovery.passwordRecoveryQuestion=e.secretQuestionLabel,w.passwordRecovery.passwordRecoveryQuestionKey=e.secretQuestion):"SecondaryEmail"===e.mode?w.passwordRecovery.passwordRecoverySecondaryEmailText=l("A link will be sent to %{0}",e.obfuscatedRecoveryEmail):"Disabled"===e.mode&&(w.loginStLine truncated
!function(){"use strict";angular.module("SOGo.MainUI",["SOGo.Common","SOGo.Authentication"]);function e(e,s,o,r,a,i,n,t,d,c){var w=this;this.$onInit=function(){this.creds={username:s.cookieUsername,password:null,domain:null,rememberLogin:angular.isDefined(s.cookieUsername)&&0<s.cookieUsername.length},/\blanguage=/.test(s.location.search)&&(this.creds.language=s.language),this.loginState=!1,this.verificationCodePattern="\\d{6}",this.passwords={newPassword:null,newPasswordConfirmation:null,oldPassword:null,visible:!1},this.passwordRecovery={passwordRecoveryEnabled:!1,passwordRecoveryQuestionKey:null,passwordRecoveryQuestion:null,passwordRecoveryMode:null,passwordRecoveryQuestionAnswer:null,passwordRecoveryToken:null,passwordRecoveryLinkTimer:null,passwordRecoverySecondaryEmailText:null,passwordRecoveryMailDomain:null,showLoader:!1},this.showLogin=!1,o(function(){w.showLogin=!0;var e=window.location.search;let s=new URLSearchParams(e).get("token");0<window.location.pathname.indexOf("passwordRecoveryEmail")&&s?3===(e=(s=s.replace(/\//g,"")).split(".")).length&&(w.passwordRecovery.passwordRecoveryToken=s,e=JSON.parse(atob(e[1])),w.creds.username=e.username,w.creds.domain=e.domain,w.passwordRecovery.passwordRecoveryToken=s,w.passwordRecovery.passwordRecoveryMode="SecondaryEmail",w.passwordRecovery.passwordRecoveryEnabled=!0,w.loginState="passwordchange",t("loginContent")):w.retrievePasswordRecoveryEnabled(),0<document.querySelectorAll("*:autofill").length&&document.querySelectorAll("*:autofill").forEach(e=>{e.parentElement.classList.add("md-input-has-value")})},100)},this.login=function(){return w.loginState="authenticating",i.login(w.creds).then(function(e){e.totpmissingkey?(w.loginState="totpcode",n("totpcode")):e.totpdisabled?(w.loginState="totpdisabled",w.cn=e.cn,w.url=e.url):(w.loginState="logged",w.cn=e.cn,w.url=e.url,o(function(){w.continueLogin()},1e3))},function(e){var s,o;w.loginState="error",e.error?w.errorMessage=e.error:0<e.grace?(w.loginState="passwordwillexpire",w.cn=e.cn,w.url=e.url,w.passwordPolicy=e.userPolicies||[],w.errorMessage=l("You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.",e.grace)):0<e.expire?(o=86400<e.expire?(s=Math.round(e.expire/86400),l("days")):3600<e.expire?(s=Math.round(e.expire/3600),l("hours")):60<e.expire?(s=Math.round(e.expire/60),l("minutes")):(s=e.expire,l("seconds")),w.loginState="passwordwillexpire",w.cn=e.cn,w.url=e.url,w.errorMessage=l("Your password is going to expire in %{0} %{1}.",s,o)):(e.passwordexpired&&2==e.passwordexpired||e.passwordexpired)&&(w.loginState="passwordchange",w.passwordPolicy=e.userPolicies||[],w.url=e.url,w.passwordexpired=e.passwordexpired)}),!1},this.restoreLogin=function(){"SecretQuestion"===w.passwordRecovery.passwordRecoveryMode?t("loginContent"):delete w.creds.verificationCode,w.passwordRecoveryAbort()},this.continueLogin=function(){s.location.href===w.url?s.location.reload(!0):s.location.href=w.url},this.showAbout=function(e){function s(e){this.closeDialog=function(){e.hide()}}a.show({targetEvent:e,templateUrl:"aboutBox.html",controller:s,controllerAs:"about"}),s.$inject=["$mdDialog"]},this.changeLanguage=function(e){s.location.href=ApplicationBaseURL+"changeLanguage?language="+this.creds.language},this.canChangePassword=function(e){return this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword!=this.passwords.newPasswordConfirmation?(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!1),!1):(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!0),!!(this.passwords.newPassword&&0<this.passwords.newPassword.length&&this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword==this.passwords.newPasswordConfirmation&&(this.isInPasswordRecoveryMode()||!this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length||"passwordchange"==this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length)))},this.changePassword=function(){i.changePassword(this.creds.username,this.creds.domain,this.passwords.newPassword,this.passwords.oldPassword,this.passwordRecovery.passwordRecoveryToken).then(function(e){w.loginState="message",w.url=e.url,w.errorMessage=l("The password was changed successfully.")},function(e){c.show(c.simple().textContent(e).position(d.toastPosition).hideDelay(2e3))})},this.passwordRecoveryInfo=function(){w.loginState="passwordrecovery",w.passwordRecovery.showLoader=!0,i.passwordRecovery(this.creds.username,this.creds.domain).then(function(e){w.passwordRecovery.passwordRecoveryMode=e.mode,"SecretQuestion"===e.mode?(w.passwordRecovery.passwordRecoveryQuestion=e.secretQuestionLabel,w.passwordRecovery.passwordRecoveryQuestionKey=e.secretQuestion):"SecondaryEmail"===e.mode?w.passwordRecovery.passwordRecoverySecondaryEmailText=l("A link will be sent to %{0}",e.obfuscatedRecoveryEmail):"Disabled"===e.mode&&(Line truncated
//# sourceMappingURL=Main.js.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"Main.js","sources":["Main/Main.app.js"],"names":["angular","module","LoginController","$scope","$window","$timeout","Dialog","$mdDialog","Authentication","focus","rippleDo","sgConstant","$mdToast","vm","this","$onInit","creds","username","cookieUsername","password","domain","rememberLogin","isDefined","length","test","location","search","language","loginState","verificationCodePattern","passwords","newPassword","newPasswordConfirmation","oldPassword","visible","passwordRecovery","passwordRecoveryEnabled","passwordRecoveryQuestionKey","passwordRecoveryQuestion","passwordRecoveryMode","passwordRecoveryQuestionAnswer","passwordRecoveryToken","passwordRecoveryLinkTimer","passwordRecoverySecondaryEmailText","passwordRecoveryMailDomain","showLoader","showLogin","queryString","window","let","token","URLSearchParams","get","pathname","indexOf","tokenArray","replace","split","info","JSON","parse","atob","retrievePasswordRecoveryEnabled","document","querySelectorAll","forEach","el","parentElement","classList","add","login","then","data","totpmissingkey","totpdisabled","cn","url","continueLogin","msg","value","string","error","errorMessage","grace","passwordPolicy","userPolicies","l","expire","Math","round","passwordexpired","restoreLogin","verificationCode","passwordRecoveryAbort","href","reload","showAbout","$event","AboutDialogController","closeDialog","hide","show","targetEvent","templateUrl","controller","controllerAs","$inject","changeLanguage","ApplicationBaseURL","canChangePassword","form","$setValidity","isInPasswordRecoveryMode","changePassword","simple","textContent","position","toastPosition","hideDelay","passwordRecoveryInfo","mode","secretQuestionLabel","secretQuestion","obfuscatedRecoveryEmail","passwordRecoveryEmail","passwordRecoveryCheck","isPasswordExpiredSecurity","usernameChanged","clearTimeout","setTimeout","mailDomain","changePasswordVisibility","field","getElementById","type","innerHTML"],"mappings":"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 truncated
{"version":3,"file":"Main.js","sources":["Main/Main.app.js"],"names":["angular","module","LoginController","$scope","$window","$timeout","Dialog","$mdDialog","Authentication","focus","rippleDo","sgConstant","$mdToast","vm","this","$onInit","creds","username","cookieUsername","password","domain","rememberLogin","isDefined","length","test","location","search","language","loginState","verificationCodePattern","passwords","newPassword","newPasswordConfirmation","oldPassword","visible","passwordRecovery","passwordRecoveryEnabled","passwordRecoveryQuestionKey","passwordRecoveryQuestion","passwordRecoveryMode","passwordRecoveryQuestionAnswer","passwordRecoveryToken","passwordRecoveryLinkTimer","passwordRecoverySecondaryEmailText","passwordRecoveryMailDomain","showLoader","showLogin","queryString","window","let","token","URLSearchParams","get","pathname","indexOf","tokenArray","replace","split","info","JSON","parse","atob","retrievePasswordRecoveryEnabled","document","querySelectorAll","forEach","el","parentElement","classList","add","login","then","data","totpmissingkey","totpdisabled","cn","url","continueLogin","msg","value","string","error","errorMessage","grace","passwordPolicy","userPolicies","l","expire","Math","round","passwordexpired","restoreLogin","verificationCode","passwordRecoveryAbort","href","reload","showAbout","$event","AboutDialogController","closeDialog","hide","show","targetEvent","templateUrl","controller","controllerAs","$inject","changeLanguage","ApplicationBaseURL","canChangePassword","form","$setValidity","isInPasswordRecoveryMode","changePassword","simple","textContent","position","toastPosition","hideDelay","passwordRecoveryInfo","mode","secretQuestionLabel","secretQuestion","obfuscatedRecoveryEmail","passwordRecoveryEmail","passwordRecoveryCheck","isPasswordExpiredSecurity","usernameChanged","clearTimeout","setTimeout","mailDomain","changePasswordVisibility","field","getElementById","type","innerHTML"],"mappings":"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 truncated
+61 -1
View File
@@ -20,6 +20,8 @@
domain: null,
rememberLogin: angular.isDefined($window.cookieUsername) && $window.cookieUsername.length > 0
};
if($window.loginHint)
this.creds.username = $window.loginHint;
// Send selected language only if user has changed it
if (/\blanguage=/.test($window.location.search))
this.creds.language = $window.language;
@@ -164,6 +166,64 @@
return false;
};
this.loginName = function() {
vm.loginState = 'authenticating';
Authentication.loginName(vm.creds)
.then(function(data) {
vm.loginState = 'logged';
vm.cn = data.cn;
vm.url = data.url;
// Let the user see the succesfull message before reloading the page
$timeout(function() {
vm.continueLogin();
}, 1000);
}, function(msg) {
vm.loginState = 'error';
if (msg.error) {
vm.errorMessage = msg.error;
}
else if (msg.grace > 0) {
// Password is expired, grace logins limit is not yet reached
vm.loginState = 'passwordwillexpire';
vm.cn = msg.cn;
vm.url = msg.url;
vm.errorMessage = l('You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.', msg.grace);
}
else if (msg.expire > 0) {
// Password will soon expire
var value, string;
if (msg.expire > 86400) {
value = Math.round(msg.expire/86400);
string = l("days");
}
else if (msg.expire > 3600) {
value = Math.round(msg.expire/3600);
string = l("hours");
}
else if (msg.expire > 60) {
value = Math.round(msg.expire/60);
string = l("minutes");
}
else {
value = msg.expire;
string = l("seconds");
}
vm.loginState = 'passwordwillexpire';
vm.cn = msg.cn;
vm.url = msg.url;
vm.errorMessage = l('Your password is going to expire in %{0} %{1}.', value, string);
}
else if (msg.passwordexpired) {
vm.loginState = 'passwordchange';
vm.url = msg.url;
}
});
return false;
};
this.restoreLogin = function () {
if ('SecretQuestion' === vm.passwordRecovery.passwordRecoveryMode) {
rippleDo('loginContent');
@@ -198,7 +258,7 @@
this.changeLanguage = function ($event) {
// Reload page
$window.location.href = ApplicationBaseURL + 'login?language=' + this.creds.language;
$window.location.href = ApplicationBaseURL + 'changeLanguage?language=' + this.creds.language;
};
this.canChangePassword = function (form) {
@@ -1,2 +1,2 @@
!function(){"use strict";function d(e){this.component=e,this.component.attendees&&_.forEach(this.component.attendees,function(e){e.image=d.$gravatar(e.email,32)}),this.workDaysOnly=!0,this.slotStartTimeLimit=new Date,this.slotStartTimeLimit.setMinutes(0),this.slotStartTimeLimit.setHours(d.dayStartHour),this.slotEndTimeLimit=new Date,this.slotEndTimeLimit.setMinutes(0),this.slotEndTimeLimit.setHours(d.dayEndHour),this.$days=[],this.$futureFreebusyData={},this.updateFreeBusyCoverage(),this.updateFreeBusy(),0==this.$days.length&&this.getDays()}d.$factory=["$q","$timeout","$log","sgSettings","Attendees_ROLES","Preferences","User","Card","Gravatar","Resource",function(e,t,n,i,a,o,r,s,c,l){return angular.extend(d,{$q:e,$timeout:t,$log:n,$settings:i,$User:r,$Preferences:o,$Card:s,$gravatar:c,$$resource:new l(i.activeUser("folderURL")+"Calendar",i.activeUser()),ROLES:a}),d.dayStartHour=parseInt(o.defaults.SOGoDayStartTime.split(":")[0]),d.dayEndHour=parseInt(o.defaults.SOGoDayEndTime.split(":")[0]),d}];try{angular.module("SOGo.SchedulerUI")}catch(e){angular.module("SOGo.SchedulerUI",["SOGo.Common"])}angular.module("SOGo.SchedulerUI").constant("Attendees_ROLES",{REQ_PARTICIPANT:"req-participant",OPT_PARTICIPANT:"opt-participant",NON_PARTICIPANT:"non-participant",CHAIR:"chair"}).factory("Attendees",d.$factory),d.timeToQuarters=function(e){return 4*e.getHours()+Math.ceil(e.getMinutes()/15)},d.prototype.getLength=function(){return this.component.attendees?this.component.attendees.length:0},d.prototype.initOrganizer=function(e){var t=this,e=e&&e.isSubscription?d.$User.$filter(e.owner).then(function(e){e=e[0];t.component.organizer={uid:e.uid,name:e.cn,email:e.c_email}}):(this.component.organizer||(this.component.organizer={uid:d.$settings.activeUser("login"),name:d.$settings.activeUser("identification"),email:d.$settings.activeUser("email")}),d.$q.when());e.then(function(){t.updateFreeBusyAttendee(t.component.organizer)})},d.prototype.add=function(e,t){var n,i,a=this,o=d.$q.when();return e&&((!this.component.attendees||t&&t.organizerCalendar)&&this.initOrganizer(t?t.organizerCalendar:null),e.$isList({expandable:!0})?o=(i=d.$Card.$find(e.container,e.c_name)).$id().then(function(e){_.forEach(i.refs,function(e){n={name:e.c_cn,email:e.$preferredEmail(t?t.partial:null),role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",uid:e.c_uid,$avatarIcon:"person"},_.find(a.component.attendees,function(e){return e.email==n.email})||(n.image=d.$gravatar(n.email,32),a.component.attendees?a.component.attendees.push(n):a.component.attendees=[n],a.updateFreeBusyAttendee(n))})}):(n={uid:e.c_uid,domain:e.c_domain,isMSExchange:e.ismsexchange,isGroup:e.$isList(),isExpandableGroup:!1,isResource:e.isresource,name:e.c_cn,email:e.$$email,role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",$avatarIcon:e.$avatarIcon},_.find(this.attendees,function(e){return e.email==n.email})||(e.$isList()&&d.$Preferences.defaults.SOGoLDAPGroupExpansionEnabled&&(o=e.$members().then(function(e){n.members=e,n.isExpandableGroup=!0})),n.image=d.$gravatar(n.email,32),this.component.attendees?_.findIndex(this.component.attendees,{email:n.email})<0&&this.component.attendees.push(n):this.component.attendees=[n],this.updateFreeBusyAttendee(n)))),o},d.prototype.nextRole=function(t){var e=_.values(d.ROLES),n=_.findIndex(e,function(e){return t.role===e});t.role=e[++n%4]},d.prototype.hasAttendee=function(e){var t=_.find(this.component.attendees,function(t){return _.find(e.emails,function(e){return e.value==t.email})});return angular.isDefined(t)},d.prototype.remove=function(t){var e=_.findIndex(this.component.attendees,function(e){return e.email==t.email});-1<e&&this.component.attendees.splice(e,1),delete this.$futureFreebusyData[t.uid]},d.prototype.updateFreeBusyCoverage=function(){var o,r,s,e,c={};this.component.start&&this.component.end&&(o=new Date(this.component.start.getTime()),r=new Date(this.component.end.getTime()),this.component.isAllDay?(o.setHours(d.dayStartHour),o.setMinutes(0),r.setHours(d.dayEndHour),r.setMinutes(0),s=e=0):(s=parseInt(o.getMinutes()/15+.5),e=parseInt(r.getMinutes()/15+.5)),o.setMinutes(15*s),r.setMinutes(15*e),_.forEach(o.beginOfDay().daysUpTo(r.beginOfDay()),function(e,t){var n,i=(e=e<o?new Date(o.getTime()):e).getDate(),a=e.getDayString();if(a===o.getDayString())for(n=e.getHours().toString(),c[a]={},c[a][n]=[];0<s;)c[a][n].push(0),s--;else e=e.beginOfDay(),c[a]={};for(;e.getTime()<r.getTime()&&e.getDate()==i;)n=e.getHours().toString(),angular.isUndefined(c[a][n])&&(c[a][n]=[]),c[a][n].push(1),e.addMinutes(15)}),this.freebusy=c)},d.prototype.coversFreeBusy=function(e,t,n){return this.freebusy&&angular.isDefined(this.freebusy[e])&&angular.isDefined(this.freebusy[e][t])&&1==this.freebusy[e][t][n]},d.prototype.getDays=function(e){var t,n,i,a=this;return e?(t=e,(n=new Date(e.getTime())).addMinutes(this.component.delta)):(t=this.component.start,n=this.component.end),(0===this.$days.length||_.findIndex(this.$days,["getDayString",t.getDayString()])<0||_Line truncated
!function(){"use strict";function d(e){this.component=e,this.component.attendees&&_.forEach(this.component.attendees,function(e){e.image=d.$gravatar(e.email,32)}),this.workDaysOnly=!0,this.slotStartTimeLimit=new Date,this.slotStartTimeLimit.setMinutes(0),this.slotStartTimeLimit.setHours(d.dayStartHour),this.slotEndTimeLimit=new Date,this.slotEndTimeLimit.setMinutes(0),this.slotEndTimeLimit.setHours(d.dayEndHour),this.$days=[],this.$futureFreebusyData={},this.updateFreeBusyCoverage(),this.updateFreeBusy(),0==this.$days.length&&this.getDays()}d.$factory=["$q","$timeout","$log","sgSettings","Attendees_ROLES","Preferences","User","Card","Gravatar","Resource",function(e,t,n,i,a,o,r,s,c,l){return angular.extend(d,{$q:e,$timeout:t,$log:n,$settings:i,$User:r,$Preferences:o,$Card:s,$gravatar:c,$$resource:new l(i.activeUser("folderURL")+"Calendar",i.activeUser()),ROLES:a}),d.dayStartHour=parseInt(o.defaults.SOGoDayStartTime.split(":")[0]),d.dayEndHour=parseInt(o.defaults.SOGoDayEndTime.split(":")[0]),d}];try{angular.module("SOGo.SchedulerUI")}catch(e){angular.module("SOGo.SchedulerUI",["SOGo.Common"])}angular.module("SOGo.SchedulerUI").constant("Attendees_ROLES",{REQ_PARTICIPANT:"req-participant",OPT_PARTICIPANT:"opt-participant",NON_PARTICIPANT:"non-participant",CHAIR:"chair"}).factory("Attendees",d.$factory),d.timeToQuarters=function(e){return 4*e.getHours()+Math.ceil(e.getMinutes()/15)},d.prototype.getLength=function(){return this.component.attendees?this.component.attendees.length:0},d.prototype.initOrganizer=function(e){var t=this,e=e&&e.isSubscription?d.$User.$filter(e.owner).then(function(e){e=e[0];t.component.organizer={uid:e.uid,name:e.cn,email:e.c_email}}):(this.component.organizer||(this.component.organizer={uid:d.$settings.activeUser("login"),name:d.$settings.activeUser("identification"),email:d.$settings.activeUser("email")}),d.$q.when());e.then(function(){t.updateFreeBusyAttendee(t.component.organizer)})},d.prototype.add=function(e,t){var n,i,a=this,o=d.$q.when();return e&&((!this.component.attendees||t&&t.organizerCalendar)&&this.initOrganizer(t?t.organizerCalendar:null),e.$isList({expandable:!0})?o=(i=d.$Card.$find(e.container,e.c_name)).$id().then(function(e){_.forEach(i.refs,function(e){n={name:e.c_cn,email:e.$preferredEmail(t?t.partial:null),role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",uid:e.c_uid,$avatarIcon:"person"},_.find(a.component.attendees,function(e){return e.email==n.email})||(n.image=d.$gravatar(n.email,32),a.component.attendees?a.component.attendees.push(n):a.component.attendees=[n],a.updateFreeBusyAttendee(n))})}):(n={uid:e.c_uid,domain:e.c_domain,isMSExchange:e.ismsexchange,isGroup:e.$isList(),isExpandableGroup:!1,isResource:e.isresource,name:e.c_cn,email:e.$$email,role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",$avatarIcon:e.$avatarIcon},_.find(this.attendees,function(e){return e.email==n.email})||(e.$isList()&&d.$Preferences.defaults.SOGoLDAPGroupExpansionEnabled&&(o=e.$members().then(function(e){n.members=e,n.isExpandableGroup=!0})),n.image=d.$gravatar(n.email,32),this.component.attendees?_.findIndex(this.component.attendees,{email:n.email})<0&&this.component.attendees.push(n):this.component.attendees=[n],this.updateFreeBusyAttendee(n)))),o},d.prototype.nextRole=function(t){var e=_.values(d.ROLES),n=_.findIndex(e,function(e){return t.role===e});t.role=e[++n%4]},d.prototype.hasAttendee=function(e){var t=_.find(this.component.attendees,function(t){return _.find(e.emails,function(e){return e.value==t.email})});return angular.isDefined(t)},d.prototype.remove=function(t){var e=_.findIndex(this.component.attendees,function(e){return e.email==t.email});-1<e&&this.component.attendees.splice(e,1),delete this.$futureFreebusyData[t.uid]},d.prototype.updateFreeBusyCoverage=function(){var o,r,s,e,c={};this.component.start&&this.component.end&&(o=new Date(this.component.start.getTime()),r=new Date(this.component.end.getTime()),this.component.isAllDay?(o.setHours(d.dayStartHour),o.setMinutes(0),r.setHours(d.dayEndHour),r.setMinutes(0),s=e=0):(s=parseInt(o.getMinutes()/15+.5),e=parseInt(r.getMinutes()/15+.5)),o.setMinutes(15*s),r.setMinutes(15*e),_.forEach(o.beginOfDay().daysUpTo(r.beginOfDay()),function(e,t){var n,i=(e=e<o?new Date(o.getTime()):e).getDate(),a=e.getDayString();if(a===o.getDayString())for(n=e.getHours().toString(),c[a]={},c[a][n]=[];0<s;)c[a][n].push(0),s--;else e=e.beginOfDay(),c[a]={};for(;e.getTime()<r.getTime()&&e.getDate()==i;)n=e.getHours().toString(),angular.isUndefined(c[a][n])&&(c[a][n]=[]),c[a][n].push(1),e.addMinutes(15)}),this.freebusy=c)},d.prototype.coversFreeBusy=function(e,t,n){return this.freebusy&&angular.isDefined(this.freebusy[e])&&angular.isDefined(this.freebusy[e][t])&&1==this.freebusy[e][t][n]},d.prototype.getDays=function(e){var t,n,i,a=this;return e?(t=e,(n=new Date(e.getTime())).addMinutes(this.component.delta)):(t=this.component.start,n=this.component.end),(0===this.$days.length||_.findIndex(this.$days,["getDayString",t.getDayString()])<0||_Line truncated
//# sourceMappingURL=Scheduler.services.js.map
@@ -1 +1 @@
{"version":3,"file":"Scheduler.services.js","sources":["Scheduler/Attendees.service.js","Scheduler/Calendar.service.js","Scheduler/Component.service.js","Scheduler/CalendarController.js","Scheduler/CalendarListController.js","Scheduler/CalendarsController.js","Scheduler/ComponentController.js","Scheduler/sgCalendarDay.directive.js","Scheduler/sgCalendarDayBlock.directive.js","Scheduler/sgCalendarDayTable.directive.js","Scheduler/sgCalendarGhost.directive.js","Scheduler/sgCalendarListEvent.directive.js","Scheduler/sgCalendarListItem.directive.js","Scheduler/sgCalendarMonthDay.directive.js","Scheduler/sgCalendarMonthEvent.directive.js","Scheduler/sgCalendarPrintStylesheet.directive.js","Scheduler/sgCalendarScrollView.directive.js","Scheduler/sgCategoryStylesheet.directive.js","Scheduler/sgDraggableCalendarBlock.directive.js","Scheduler/sgFreebusy.directive.js","Scheduler/sgFreebusyDay.directive.js","Scheduler/sgNowLine.directive.js"],"names":["Attendees","component","this","attendees","_","forEach","attendee","image","$gravatar","email","workDaysOnly","slotStartTimeLimit","Date","setMinutes","setHours","dayStartHour","slotEndTimeLimit","dayEndHour","$days","$futureFreebusyData","updateFreeBusyCoverage","updateFreeBusy","length","getDays","$factory","$q","$timeout","$log","Settings","ROLES","Preferences","User","Card","Gravatar","Resource","angular","extend","$settings","$User","$Preferences","$Card","$$resource","activeUser","parseInt","defaults","SOGoDayStartTime","split","SOGoDayEndTime","module","e","constant","REQ_PARTICIPANT","OPT_PARTICIPANT","NON_PARTICIPANT","CHAIR","factory","timeToQuarters","dateTime","getHours","Math","ceil","getMinutes","prototype","getLength","initOrganizer","calendar","_this","promise","isSubscription","$filter","owner","then","results","organizer","uid","name","cn","c_email","when","updateFreeBusyAttendee","add","card","options","list","organizerCalendar","$isList","expandable","$find","container","c_name","$id","listId","refs","ref","c_cn","$preferredEmail","partial","role","partstat","c_uid","$avatarIcon","find","o","push","domain","c_domain","isMSExchange","ismsexchange","isGroup","isExpandableGroup","isResource","isresource","$$email","SOGoLDAPGroupExpansionEnabled","$members","members","findIndex","nextRole","roles","values","index","hasAttendee","emails","value","isDefined","remove","currentAttendee","splice","roundedStart","roundedEnd","startQuarter","endQuarter","freebusy","start","end","getTime","isAllDay","beginOfDay","daysUpTo","date","hourKey","currentDay","getDate","dayKey","getDayString","toString","isUndefined","addMinutes","coversFreeBusy","day","hour","quarter","refDate","sd","ed","formatFcn","delta","addDays","$mdDateLocaleProvider","formatDate","$dateFormat","SOGoLongDateFormat","stringWithSeparator","promises","filter","all","resource","days","params","sday","map","eday","userResource","intersection","keys","fetch","data","i","forwardFindDate","currentStart","foundDate","maxOffset","endLimit","duration","offset","firstStep","floor","currentEntries","indexOf","startLimit","foundTime","testDuration","setTime","forwardAdjustCurrentStart","getDay","backwardFindDate","lastIndexOf","testOffset","debug","backwardAdjustCurrentStart","findSlot","direction","findDate","adjustCurrentStart","clone","setSeconds","step","catch","err","mergeFreebusy","startDay","j","attendeeEntries","flatMap","count","reject","l","Calendar","futureCalendarData","init","id","newCalendarData","create","$unwrap","Component","Acl","$Component","$$Acl","$view","EventDragDayLength","EventDragHorizontalOffset","ConflictHTTPErrorCode","$defaultCalendar","SOGoDefaultCalendar","$findAll","active","$add","isWebCalendar","$webcalendars","$subscriptions","$calendars","sibling","localeCompare","settings","FoldersOrder","saveFoldersOrder","$reloadAll","writable","contextId","calendars","union","isOwned","acls","objectCreator","calendarData","group","login","$get","$getIndex","$subscribe","path","$addWebCalendar","url","d","defer","urls","webCalendarURL","post","isEditable","isRemote","JSON","stringify","undefined","resolve","response","status","reloadWebCalendars","$error","statusText","$deleteComponents","components","pid","uids","saveFoldersActivation","ids","request","folders","color","$acl","isSuperUser","$shadowData","$omit","$futureCalendarData","getClassName","base","$rename","$save","$delete","$reset","key","save","setCredentials","username","password","export","realOwnerId","type","filename","webDavICSURL","ownerPaths","substring","join","open","downloadProvisioningProfile","$setActivation","$getComponent","componentId","recurrenceId","isError","isObject","copy","futureComponentData","newComponentData","newguid","isNew","$rootScope","Component_STATUS","STATUS","$Attendees","timeFormat","$query","search","$queryEvents","sort","asc","filterpopup","$queryTasks","$refreshTimeout","$ghost","EventsFilterState","TasksFilterState","EventsSortingState","TasksSortingState","show_completed","ShowCompletedLine truncated
{"version":3,"file":"Scheduler.services.js","sources":["Scheduler/Attendees.service.js","Scheduler/Calendar.service.js","Scheduler/Component.service.js","Scheduler/CalendarController.js","Scheduler/CalendarListController.js","Scheduler/CalendarsController.js","Scheduler/ComponentController.js","Scheduler/sgCalendarDay.directive.js","Scheduler/sgCalendarDayBlock.directive.js","Scheduler/sgCalendarDayTable.directive.js","Scheduler/sgCalendarGhost.directive.js","Scheduler/sgCalendarListEvent.directive.js","Scheduler/sgCalendarListItem.directive.js","Scheduler/sgCalendarMonthDay.directive.js","Scheduler/sgCalendarMonthEvent.directive.js","Scheduler/sgCalendarPrintStylesheet.directive.js","Scheduler/sgCalendarScrollView.directive.js","Scheduler/sgCategoryStylesheet.directive.js","Scheduler/sgDraggableCalendarBlock.directive.js","Scheduler/sgFreebusy.directive.js","Scheduler/sgFreebusyDay.directive.js","Scheduler/sgNowLine.directive.js"],"names":["Attendees","component","this","attendees","_","forEach","attendee","image","$gravatar","email","workDaysOnly","slotStartTimeLimit","Date","setMinutes","setHours","dayStartHour","slotEndTimeLimit","dayEndHour","$days","$futureFreebusyData","updateFreeBusyCoverage","updateFreeBusy","length","getDays","$factory","$q","$timeout","$log","Settings","ROLES","Preferences","User","Card","Gravatar","Resource","angular","extend","$settings","$User","$Preferences","$Card","$$resource","activeUser","parseInt","defaults","SOGoDayStartTime","split","SOGoDayEndTime","module","e","constant","REQ_PARTICIPANT","OPT_PARTICIPANT","NON_PARTICIPANT","CHAIR","factory","timeToQuarters","dateTime","getHours","Math","ceil","getMinutes","prototype","getLength","initOrganizer","calendar","_this","promise","isSubscription","$filter","owner","then","results","organizer","uid","name","cn","c_email","when","updateFreeBusyAttendee","add","card","options","list","organizerCalendar","$isList","expandable","$find","container","c_name","$id","listId","refs","ref","c_cn","$preferredEmail","partial","role","partstat","c_uid","$avatarIcon","find","o","push","domain","c_domain","isMSExchange","ismsexchange","isGroup","isExpandableGroup","isResource","isresource","$$email","SOGoLDAPGroupExpansionEnabled","$members","members","findIndex","nextRole","roles","values","index","hasAttendee","emails","value","isDefined","remove","currentAttendee","splice","roundedStart","roundedEnd","startQuarter","endQuarter","freebusy","start","end","getTime","isAllDay","beginOfDay","daysUpTo","date","hourKey","currentDay","getDate","dayKey","getDayString","toString","isUndefined","addMinutes","coversFreeBusy","day","hour","quarter","refDate","sd","ed","formatFcn","delta","addDays","$mdDateLocaleProvider","formatDate","$dateFormat","SOGoLongDateFormat","stringWithSeparator","promises","filter","all","resource","days","params","sday","map","eday","userResource","intersection","keys","fetch","data","i","forwardFindDate","currentStart","foundDate","maxOffset","endLimit","duration","offset","firstStep","floor","currentEntries","indexOf","startLimit","foundTime","testDuration","setTime","forwardAdjustCurrentStart","getDay","backwardFindDate","lastIndexOf","testOffset","debug","backwardAdjustCurrentStart","findSlot","direction","findDate","adjustCurrentStart","clone","setSeconds","step","catch","err","mergeFreebusy","startDay","j","attendeeEntries","flatMap","count","reject","l","Calendar","futureCalendarData","init","id","newCalendarData","create","$unwrap","Component","Acl","$Component","$$Acl","$view","EventDragDayLength","EventDragHorizontalOffset","ConflictHTTPErrorCode","$defaultCalendar","SOGoDefaultCalendar","$findAll","active","$add","isWebCalendar","$webcalendars","$subscriptions","$calendars","sibling","localeCompare","settings","FoldersOrder","saveFoldersOrder","$reloadAll","writable","contextId","calendars","union","isOwned","acls","objectCreator","calendarData","group","login","$get","$getIndex","$subscribe","path","$addWebCalendar","url","d","defer","urls","webCalendarURL","post","isEditable","isRemote","JSON","stringify","undefined","resolve","response","status","reloadWebCalendars","$error","statusText","$deleteComponents","components","pid","uids","saveFoldersActivation","ids","request","folders","color","$acl","isSuperUser","$shadowData","$omit","$futureCalendarData","getClassName","base","$rename","$save","$delete","$reset","key","save","setCredentials","username","password","export","realOwnerId","type","filename","webDavICSURL","ownerPaths","substring","join","open","downloadProvisioningProfile","$setActivation","$getComponent","componentId","recurrenceId","isError","isObject","copy","futureComponentData","newComponentData","newguid","isNew","$rootScope","Component_STATUS","STATUS","$Attendees","timeFormat","$query","search","$queryEvents","sort","asc","filterpopup","$queryTasks","$refreshTimeout","$ghost","EventsFilterState","TasksFilterState","EventsSortingState","TasksSortingState","show_completed","ShowCompletedLine truncated
@@ -831,11 +831,36 @@
* @param {number} index - the URL index in the list of attach URLs
*/
Component.prototype.deleteAttachUrl = function(index) {
if (index > -1 && this.attachUrls.length > index) {
this.attachUrls.splice(index, 1);
}
};
/**
* @function hasJitsiUrl
* @memberof Component.prototype
* @desc Check if the there is a jisti url
* @returns true if there is a jisti url
*/
Component.prototype.hasJitsiUrl = function() {
if (angular.isUndefined(this.attachUrls)) {
return false;
}
else {
var jitsiBaseUrl = "https://meet.jit.si";
if(Component.$Preferences.defaults && Component.$Preferences.defaults.SOGoCalendarJitsiBaseUrl)
jitsiBaseUrl = Component.$Preferences.defaults.SOGoCalendarJitsiBaseUrl;
for (var i = 0; i < this.attachUrls.length; i++) {
if (this.attachUrls[i].value.includes(jitsiBaseUrl)) {
return true;
}
}
}
return false;
};
/**
* @function $addDueDate
* @memberof Component.prototype
@@ -232,6 +232,7 @@
this.showAttendeesEditor = this.component.attendees && this.component.attendees.length;
this.isFullscreen = (typeof screen.orientation !== 'undefined' && screen.orientation && 'portrait-primary' == screen.orientation.type);
this.originalModalCancel = $mdDialog.cancel;
this.preferences = Preferences;
if (this.component.type == 'appointment') {
this.component.initAttendees();
@@ -313,6 +314,15 @@
focus('attachUrl_' + i);
};
this.addJitsiUrl = function () {
var jitsiBaseUrl = "https://meet.jit.si";
if(this.preferences.defaults && this.preferences.defaults.SOGoCalendarJitsiBaseUrl)
jitsiBaseUrl = this.preferences.defaults.SOGoCalendarJitsiBaseUrl;
var jitsiUrl = jitsiBaseUrl + "/SOGo_meeting/" + crypto.randomUUID();
var i = this.component.addAttachUrl(jitsiUrl);
focus('attachUrl_' + i);
};
this.toggleRecurrenceEditor = function () {
this.showRecurrenceEditor = !this.showRecurrenceEditor;
this.component.$hasCustomRepeat = this.showRecurrenceEditor;
+1 -1
View File
@@ -1,2 +1,2 @@
!function(e,t){"function"==typeof define&&define.amd?define([],t):"undefined"!=typeof exports?t():(t(),e.FileSaver={})}(this,function(){"use strict";var s="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0;function c(e,t,a){var i=new XMLHttpRequest;i.open("GET",e),i.responseType="blob",i.onload=function(){l(i.response,t,a)},i.onerror=function(){console.error("could not download file")},i.send()}function n(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return 200<=t.status&&t.status<=299}function r(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(e){var a=document.createEvent("MouseEvents");a.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(a)}}var d=s.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),l=s.saveAs||("object"!=typeof window||window!==s?function(){}:"download"in HTMLAnchorElement.prototype&&!d?function(e,t,a){var i=s.URL||s.webkitURL,l=document.createElement("a");t=t||e.name||"download",l.download=t,l.rel="noopener","string"==typeof e?(l.href=e,l.origin!==location.origin?n(l.href)?c(e,t,a):r(l,l.target="_blank"):r(l)):(l.href=i.createObjectURL(e),setTimeout(function(){i.revokeObjectURL(l.href)},4e4),setTimeout(function(){r(l)},0))}:"msSaveOrOpenBlob"in navigator?function(e,t,a){var i;t=t||e.name||"download","string"==typeof e?n(e)?c(e,t,a):((i=document.createElement("a")).href=e,i.target="_blank",setTimeout(function(){r(i)})):navigator.msSaveOrOpenBlob((e=e,void 0===(a=a)?a={autoBom:!1}:"object"!=typeof a&&(console.warn("Deprecated: Expected third argument to be a object"),a={autoBom:!a}),a.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e),t)}:function(e,t,a,i){if((i=i||open("","_blank"))&&(i.document.title=i.document.body.innerText="downloading..."),"string"==typeof e)return c(e,t,a);var l,n,r,t="application/octet-stream"===e.type,a=/constructor/i.test(s.HTMLElement)||s.safari,o=/CriOS\/[\d]+/.test(navigator.userAgent);(o||t&&a||d)&&"undefined"!=typeof FileReader?((l=new FileReader).onloadend=function(){var e=l.result,e=o?e:e.replace(/^data:[^;]*;/,"data:attachment/file;");i?i.location.href=e:location=e,i=null},l.readAsDataURL(e)):(n=s.URL||s.webkitURL,r=n.createObjectURL(e),i?i.location=r:location.href=r,i=null,setTimeout(function(){n.revokeObjectURL(r)},4e4))});s.saveAs=l.saveAs=l,"undefined"!=typeof module&&(module.exports=l)}),function(e){e=e.af=e.af||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 van %1","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Block quote":"Verwysingsaanhaling",Bold:"Vet","Bold text":"",Cancel:"Kanselleer",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Content editing keystrokes":"","Execute the currently focused button":"","Insert code block":"Voeg bronkodeblok in",Italic:"Kursief","Italic text":"",Justify:"Belyn beide kante","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","Open the accessibility help dialog":"","Plain text":"Gewone skrif","Remove color":"Verwyder kleur","Remove Format":"Verwyder formatering","Restore default":"Herstel verstek",Save:"Stoor","Show more items":"Wys meer items",Strikethrough:"Deurstreep","Strikethrough text":"",Subscript:"Onderskrif",Superscript:"Boskrif","Text alignment":"Teksbelyning","Text alignment toolbar":"Teksbelyning nutsbank","These keyboard shortcuts allow for quick access to content editing features.":"","Toggle caption off":"","Toggle caption on":"",Underline:"Onderstreep","Underline text":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":""}),e.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),function(e){e=e.ar=e.ar||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(قد يتطلب <kbd>مفتاح Fn</kbd>)","%0 of %1":"%0 من %1",Accept:"قبول","Accessibility help":"تعليمات إمكانية الوصول","Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align Line truncated
!function(e,t){"function"==typeof define&&define.amd?define([],t):"undefined"!=typeof exports?t():(t(),e.FileSaver={})}(this,function(){"use strict";var s="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0;function c(e,t,a){var i=new XMLHttpRequest;i.open("GET",e),i.responseType="blob",i.onload=function(){l(i.response,t,a)},i.onerror=function(){console.error("could not download file")},i.send()}function n(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return 200<=t.status&&t.status<=299}function r(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(e){var a=document.createEvent("MouseEvents");a.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(a)}}var d=s.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),l=s.saveAs||("object"!=typeof window||window!==s?function(){}:"download"in HTMLAnchorElement.prototype&&!d?function(e,t,a){var i=s.URL||s.webkitURL,l=document.createElement("a");t=t||e.name||"download",l.download=t,l.rel="noopener","string"==typeof e?(l.href=e,l.origin!==location.origin?n(l.href)?c(e,t,a):r(l,l.target="_blank"):r(l)):(l.href=i.createObjectURL(e),setTimeout(function(){i.revokeObjectURL(l.href)},4e4),setTimeout(function(){r(l)},0))}:"msSaveOrOpenBlob"in navigator?function(e,t,a){var i;t=t||e.name||"download","string"==typeof e?n(e)?c(e,t,a):((i=document.createElement("a")).href=e,i.target="_blank",setTimeout(function(){r(i)})):navigator.msSaveOrOpenBlob((e=e,void 0===(a=a)?a={autoBom:!1}:"object"!=typeof a&&(console.warn("Deprecated: Expected third argument to be a object"),a={autoBom:!a}),a.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e),t)}:function(e,t,a,i){if((i=i||open("","_blank"))&&(i.document.title=i.document.body.innerText="downloading..."),"string"==typeof e)return c(e,t,a);var l,n,r,t="application/octet-stream"===e.type,a=/constructor/i.test(s.HTMLElement)||s.safari,o=/CriOS\/[\d]+/.test(navigator.userAgent);(o||t&&a||d)&&"undefined"!=typeof FileReader?((l=new FileReader).onloadend=function(){var e=l.result,e=o?e:e.replace(/^data:[^;]*;/,"data:attachment/file;");i?i.location.href=e:location=e,i=null},l.readAsDataURL(e)):(n=s.URL||s.webkitURL,r=n.createObjectURL(e),i?i.location=r:location.href=r,i=null,setTimeout(function(){n.revokeObjectURL(r)},4e4))});s.saveAs=l.saveAs=l,"undefined"!=typeof module&&(module.exports=l)}),function(e){e=e.af=e.af||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 van %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"Verwysingsaanhaling",Blue:"","Blue marker":"",Bold:"Vet","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"Kanselleer","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar"Line truncated
//# sourceMappingURL=FileSaver.min.js.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"FileSaver.min.js","sources":["../../node_modules/file-saver/dist/FileSaver.js","ckeditor/build/translations/af.js","ckeditor/build/translations/ar.js","ckeditor/build/translations/ast.js","ckeditor/build/translations/az.js","ckeditor/build/translations/bg.js","ckeditor/build/translations/bn.js","ckeditor/build/translations/bs.js","ckeditor/build/translations/ca.js","ckeditor/build/translations/cs.js","ckeditor/build/translations/da.js","ckeditor/build/translations/de-ch.js","ckeditor/build/translations/de.js","ckeditor/build/translations/el.js","ckeditor/build/translations/en-au.js","ckeditor/build/translations/en-gb.js","ckeditor/build/translations/eo.js","ckeditor/build/translations/es-co.js","ckeditor/build/translations/es.js","ckeditor/build/translations/et.js","ckeditor/build/translations/eu.js","ckeditor/build/translations/fa.js","ckeditor/build/translations/fi.js","ckeditor/build/translations/fr.js","ckeditor/build/translations/gl.js","ckeditor/build/translations/gu.js","ckeditor/build/translations/he.js","ckeditor/build/translations/hi.js","ckeditor/build/translations/hr.js","ckeditor/build/translations/hu.js","ckeditor/build/translations/hy.js","ckeditor/build/translations/id.js","ckeditor/build/translations/it.js","ckeditor/build/translations/ja.js","ckeditor/build/translations/jv.js","ckeditor/build/translations/kk.js","ckeditor/build/translations/km.js","ckeditor/build/translations/kn.js","ckeditor/build/translations/ko.js","ckeditor/build/translations/ku.js","ckeditor/build/translations/lt.js","ckeditor/build/translations/lv.js","ckeditor/build/translations/ms.js","ckeditor/build/translations/nb.js","ckeditor/build/translations/ne.js","ckeditor/build/translations/nl.js","ckeditor/build/translations/no.js","ckeditor/build/translations/oc.js","ckeditor/build/translations/pl.js","ckeditor/build/translations/pt-br.js","ckeditor/build/translations/pt.js","ckeditor/build/translations/ro.js","ckeditor/build/translations/ru.js","ckeditor/build/translations/si.js","ckeditor/build/translations/sk.js","ckeditor/build/translations/sl.js","ckeditor/build/translations/sq.js","ckeditor/build/translations/sr-latn.js","ckeditor/build/translations/sr.js","ckeditor/build/translations/sv.js","ckeditor/build/translations/th.js","ckeditor/build/translations/tk.js","ckeditor/build/translations/tr.js","ckeditor/build/translations/tt.js","ckeditor/build/translations/ug.js","ckeditor/build/translations/uk.js","ckeditor/build/translations/ur.js","ckeditor/build/translations/uz.js","ckeditor/build/translations/vi.js","ckeditor/build/translations/zh-cn.js","ckeditor/build/translations/zh.js"],"names":["global","factory","define","amd","exports","FileSaver","this","_global","window","self","download","url","name","opts","xhr","XMLHttpRequest","open","responseType","onload","saveAs","response","onerror","console","error","send","corsEnabled","e","status","click","node","dispatchEvent","MouseEvent","evt","document","createEvent","initMouseEvent","isMacOSWebView","navigator","test","userAgent","HTMLAnchorElement","prototype","blob","URL","webkitURL","a","createElement","rel","href","origin","location","target","createObjectURL","setTimeout","revokeObjectURL","msSaveOrOpenBlob","autoBom","warn","type","Blob","String","fromCharCode","popup","title","body","innerText","reader","force","isSafari","HTMLElement","safari","isChromeIOS","FileReader","onloadend","result","replace","readAsDataURL","module","t","dictionary","Object","assign","%0 of %1","Align center","Align left","Align right","Block quote","Bold","Bold text","Cancel","Clear","Close contextual balloons, dropdowns, and dialogs","Code","Content editing keystrokes","Execute the currently focused button","Insert code block","Italic","Italic text","Justify","Move focus between form fields (inputs, buttons, etc.)","Move focus to the toolbar, navigate between toolbars","Move out of an inline code style","Navigate through the toolbar","Open the accessibility help dialog","Plain text","Remove color","Remove Format","Restore default","Save","Show more items","Strikethrough","Strikethrough text","Subscript","Superscript","Text alignment","Text alignment toolbar","These keyboard shortcuts allow for quick access to content editing features.","Toggle caption off","Toggle caption on","Underline","Underline text","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.","User interface and content navigation keystrokes","getPluralForm","CKEDITOR_TRANSLATIONS","(may require <kbd>Fn</kbd>)","Accept","Accessibility help","Align cell text to the bottom","Align cell text to the center","Align cell text to the left","Align cell text to the middle","Align cell text to the right","Align cell text to the top","Align table to the left","Align table to the right","Alignment","All","Almost equal to","Angle","Approximately equal to","Aquamarine","Arrows","Asterisk operator","Austral sign","back with leftwards arrow above","Background","BelowLine truncated
{"version":3,"file":"FileSaver.min.js","sources":["../../node_modules/file-saver/dist/FileSaver.js","ckeditor/build/translations/af.js","ckeditor/build/translations/ar.js","ckeditor/build/translations/ast.js","ckeditor/build/translations/az.js","ckeditor/build/translations/bg.js","ckeditor/build/translations/bn.js","ckeditor/build/translations/bs.js","ckeditor/build/translations/ca.js","ckeditor/build/translations/cs.js","ckeditor/build/translations/da.js","ckeditor/build/translations/de-ch.js","ckeditor/build/translations/de.js","ckeditor/build/translations/el.js","ckeditor/build/translations/en-au.js","ckeditor/build/translations/en-gb.js","ckeditor/build/translations/eo.js","ckeditor/build/translations/es-co.js","ckeditor/build/translations/es.js","ckeditor/build/translations/et.js","ckeditor/build/translations/eu.js","ckeditor/build/translations/fa.js","ckeditor/build/translations/fi.js","ckeditor/build/translations/fr.js","ckeditor/build/translations/gl.js","ckeditor/build/translations/gu.js","ckeditor/build/translations/he.js","ckeditor/build/translations/hi.js","ckeditor/build/translations/hr.js","ckeditor/build/translations/hu.js","ckeditor/build/translations/hy.js","ckeditor/build/translations/id.js","ckeditor/build/translations/it.js","ckeditor/build/translations/ja.js","ckeditor/build/translations/jv.js","ckeditor/build/translations/kk.js","ckeditor/build/translations/km.js","ckeditor/build/translations/kn.js","ckeditor/build/translations/ko.js","ckeditor/build/translations/ku.js","ckeditor/build/translations/lt.js","ckeditor/build/translations/lv.js","ckeditor/build/translations/ms.js","ckeditor/build/translations/nb.js","ckeditor/build/translations/ne.js","ckeditor/build/translations/nl.js","ckeditor/build/translations/no.js","ckeditor/build/translations/oc.js","ckeditor/build/translations/pl.js","ckeditor/build/translations/pt-br.js","ckeditor/build/translations/pt.js","ckeditor/build/translations/ro.js","ckeditor/build/translations/ru.js","ckeditor/build/translations/si.js","ckeditor/build/translations/sk.js","ckeditor/build/translations/sl.js","ckeditor/build/translations/sq.js","ckeditor/build/translations/sr-latn.js","ckeditor/build/translations/sr.js","ckeditor/build/translations/sv.js","ckeditor/build/translations/th.js","ckeditor/build/translations/ti.js","ckeditor/build/translations/tk.js","ckeditor/build/translations/tr.js","ckeditor/build/translations/tt.js","ckeditor/build/translations/ug.js","ckeditor/build/translations/uk.js","ckeditor/build/translations/ur.js","ckeditor/build/translations/uz.js","ckeditor/build/translations/vi.js","ckeditor/build/translations/zh-cn.js","ckeditor/build/translations/zh.js"],"names":["global","factory","define","amd","exports","FileSaver","this","_global","window","self","download","url","name","opts","xhr","XMLHttpRequest","open","responseType","onload","saveAs","response","onerror","console","error","send","corsEnabled","e","status","click","node","dispatchEvent","MouseEvent","evt","document","createEvent","initMouseEvent","isMacOSWebView","navigator","test","userAgent","HTMLAnchorElement","prototype","blob","URL","webkitURL","a","createElement","rel","href","origin","location","target","createObjectURL","setTimeout","revokeObjectURL","msSaveOrOpenBlob","autoBom","warn","type","Blob","String","fromCharCode","popup","title","body","innerText","reader","force","isSafari","HTMLElement","safari","isChromeIOS","FileReader","onloadend","result","replace","readAsDataURL","module","t","af","dictionary","Object","assign","(may require <kbd>Fn</kbd>)","%0 of %1","Accept","Accessibility","Accessibility help","Align cell text to the bottom","Align cell text to the center","Align cell text to the left","Align cell text to the middle","Align cell text to the right","Align cell text to the top","Align center","Align left","Align right","Align table to the left","Align table to the right","Alignment","All","Almost equal to","Angle","Approximately equal to","Aquamarine","Arrows","Asterisk operator","Austral sign","back with leftwards arrow above","Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.","Big","Bitcoin sign","Black","Block quote","Blue","Blue marker","Bold","Bold text","Border","Break text","Bulleted List","Bulleted list styles toolbar","Cancel","Caption for image: %0","Caption for the image","Category","Cedi sign","Cell properties","Cent sign","Center table","Centered image","Change image text alternative","Choose heading","Circle","Clear","Click to edit block","Close","Close contextual balloons, dropdowns, and dialogs","Code","Code block","Colon sign","Color","Color picker","Column","Contains as member","Content editing keystrokes","Copy selected content","Copyright sign","Create link","Cruzeiro sign","Currency","Currency sign","Custom","Custom image size","Dashed","Decimal","Decimal with leading zero","Decrease indent","Decrease list item indent","Default","Degree sign","Delete column","Delete row","Dim greLine truncated
+4 -3
View File
@@ -1,6 +1,7 @@
(function(t){const e=t["en"]=t["en"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(may require <kbd>Fn</kbd>)","%0 of %1":"%0 of %1",Accept:"Accept","Accessibility help":"Accessibility help","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Below, you can find a list of keyboard shortcuts that can be used in the editor.",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"Bold text",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Center table","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Character categories":"Character categories","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"Click to edit block",Close:"Close","Close contextual balloons, dropdowns, and dialogs":"Close contextual balloons, dropdowns, and dialogs",Code:"Code","Colon sign":"Colon sign",Color:"Color","Color picker":"Color picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"Content editing keystrokes","Copy selected content":"Copy selected content","Copyright sign":"Copyright sign","Create link":"Create link","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"Decrease list item indent",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colors","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"Drag to move","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"Editor dialog","Editor editing area: %0":"Editor editing area: %0","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button":"Execute the currently focused button","Font Background Color":"Font Background Color","Font Color":"Font Color","Font Family":"Font Family","Font Size":"Font Size","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","Full size image":"Full size image","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"Groove","Guarani sign":"Guarani sign","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"HeadinLine truncated
!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(may require <kbd>Fn</kbd>)","%0 of %1":"%0 of %1",Accept:"Accept",Accessibility:"Accessibility","Accessibility help":"Accessibility help","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Below, you can find a list of keyboard shortcuts that can be used in the editor.",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"Bold text",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image",Category:"Category","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Center table","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"Click to edit block",Close:"Close","Close contextual balloons, dropdowns, and dialogs":"Close contextual balloons, dropdowns, and dialogs",Code:"Code","Code block":"Code block","Colon sign":"Colon sign",Color:"Color","Color picker":"Color picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"Content editing keystrokes","Copy selected content":"Copy selected content","Copyright sign":"Copyright sign","Create link":"Create link","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Custom:"Custom","Custom image size":"Custom image size",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"Decrease list item indent",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colors","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"Drag to move","Dropdown menu":"Dropdown menu","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"Editor dialog","Editor menu bar":"Editor menu bar","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Entering %0 code snippet":"Entering %0 code snippet","Entering a to-do list":"Entering a to-do list","Entering code snippet":"Entering code snippet","Error during image upload":"Error during image upload","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.","Font Background Color":"Font Background Color","Font Color":"Font Color","Font Family":"Font Family","Font Size":"Font SLine truncated
/*!
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md.
*/(function t(e,n){if(typeof exports==="object"&&typeof module==="object")module.exports=n();else if(typeof define==="function"&&define.amd)define([],n);else if(typeof exports==="object")exports["ClassicEditor"]=n();else e["ClassicEditor"]=n()})(self,(()=>(()=>{var t={5659:(t,e,n)=>{const i=n(8156);const o={};for(const t of Object.keys(i)){o[i[t]]=t}const r={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};t.exports=r;for(const t of Object.keys(r)){if(!("channels"in r[t])){throw new Error("missing channels property: "+t)}if(!("labels"in r[t])){throw new Error("missing channel labels property: "+t)}if(r[t].labels.length!==r[t].channels){throw new Error("channel and label counts mismatch: "+t)}const{channels:e,labels:n}=r[t];delete r[t].channels;delete r[t].labels;Object.defineProperty(r[t],"channels",{value:e});Object.defineProperty(r[t],"labels",{value:n})}r.rgb.hsl=function(t){const e=t[0]/255;const n=t[1]/255;const i=t[2]/255;const o=Math.min(e,n,i);const r=Math.max(e,n,i);const s=r-o;let a;let c;if(r===o){a=0}else if(e===r){a=(n-i)/s}else if(n===r){a=2+(i-e)/s}else if(i===r){a=4+(e-n)/s}a=Math.min(a*60,360);if(a<0){a+=360}const l=(o+r)/2;if(r===o){c=0}else if(l<=.5){c=s/(r+o)}else{c=s/(2-r-o)}return[a,c*100,l*100]};r.rgb.hsv=function(t){let e;let n;let i;let o;let r;const s=t[0]/255;const a=t[1]/255;const c=t[2]/255;const l=Math.max(s,a,c);const d=l-Math.min(s,a,c);const u=function(t){return(l-t)/6/d+1/2};if(d===0){o=0;r=0}else{r=d/l;e=u(s);n=u(a);i=u(c);if(s===l){o=i-n}else if(a===l){o=1/3+e-i}else if(c===l){o=2/3+n-e}if(o<0){o+=1}else if(o>1){o-=1}}return[o*360,r*100,l*100]};r.rgb.hwb=function(t){const e=t[0];const n=t[1];let i=t[2];const o=r.rgb.hsl(t)[0];const s=1/255*Math.min(e,Math.min(n,i));i=1-1/255*Math.max(e,Math.max(n,i));return[o,s*100,i*100]};r.rgb.cmyk=function(t){const e=t[0]/255;const n=t[1]/255;const i=t[2]/255;const o=Math.min(1-e,1-n,1-i);const r=(1-e-o)/(1-o)||0;const s=(1-n-o)/(1-o)||0;const a=(1-i-o)/(1-o)||0;return[r*100,s*100,a*100,o*100]};function s(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}r.rgb.keyword=function(t){const e=o[t];if(e){return e}let n=Infinity;let r;for(const e of Object.keys(i)){const o=i[e];const a=s(t,o);if(a<n){n=a;r=e}}return r};r.keyword.rgb=function(t){return i[t]};r.rgb.xyz=function(t){let e=t[0]/255;let n=t[1]/255;let i=t[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92;n=n>.04045?((n+.055)/1.055)**2.4:n/12.92;i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;const o=e*.4124+n*.3576+i*.1805;const r=e*.2126+n*.7152+i*.0722;const s=e*.0193+n*.1192+i*.9505;return[o*100,r*100,s*100]};r.rgb.lab=function(t){const e=r.rgb.xyz(t);let n=e[0];let i=e[1];let o=e[2];n/=95.047;i/=100;o/=108.883;n=n>.008856?n**(1/3):7.787*n+16/116;i=i>.008856?i**(1/3):7.787*i+16/116;o=o>.008856?o**(1/3):7.787*o+16/116;const s=116*i-16;const a=500*(n-i);const c=200*(i-o);return[s,a,c]};r.hsl.rgb=function(t){const e=t[0]/360;const n=t[1]/100;const i=t[2]/100;let o;let r;let s;if(n===0){s=i*255;return[s,s,s]}if(i<.5){o=i*(1+n)}else{o=i+n-i*n}const a=2*i-o;const c=[0,0,0];for(let t=0;t<3;t++){r=e+1/3*-(t-1);if(r<0){r++}if(r>1){r--}if(6*r<1){s=a+(o-a)*6*r}else if(2*r<1){s=o}else if(3*r<2){s=a+(o-a)*(2/3-r)*6}else{s=a}c[t]=s*255}return c};r.hsl.hsv=function(t){const e=t[0];let n=t[1]/100;let i=t[2]/100;let o=n;const r=Math.max(i,.01);i*=2;n*=i<=1?i:2-i;o*=r<=1?r:2-r;const s=(i+n)/2;const a=i===0?2*o/(r+o):2*n/(i+n);return[e,a*100,s*100]};r.hsv.rgb=function(t){const e=t[0]/60;const n=t[1]/100;let i=t[2]/100;const o=Math.floor(e)%6;const r=e-Math.floor(e);const s=255*i*(1-n);const a=255*i*(1-n*r);const c=255*i*(1-n*(1-r));i*=255;switch(o){case 0:return[i,c,s];case 1:return[a,i,s];case 2:return[s,i,c];case 3:return[s,a,i];case 4:return[c,s,i];case 5:return[i,s,a]}};r.hsv.hsl=function(t){const e=t[0];const n=t[1]/100;const i=t[2]/100;const o=Math.max(i,.01);let r;let s;s=(2-n)*i;const a=(2-n)*o;r=n*o;r/=a<=1?a:2-a;r=r||0;s/=2;return[e,r*100,s*100]};r.hwb.rgb=function(t){const e=t[0]/360;let n=t[1]/100;let i=t[2]/100;const o=n+i;let r;if(o>1){n/=o;i/=o}const s=Math.floor(6*e);const a=1-i;r=6*e-s;if((s&1)!==0){r=1-r}const c=n+r*(a-n);let l;let d;let u;switch(s){default:case 6:case 0:l=a;d=c;u=n;break;case 1:l=c;d=a;u=n;break;case 2:l=n;d=a;u=c;break;case 3:l=n;d=c;u=a;break;case 4:l=c;d=n;u=a;break;case 5:l=a;d=n;u=c;break}return[l*255,d*255,u*255]};r.cmyk.rgb=function(t){const e=t[0]/100;const n=t[1]/100;const i=t[2]/100;const o=t[3]/100;const r=1-Math.min(1,e*(1-o)+o);const s=1-Math.min(1,n*(1-o)+o);const a=1-Math.min(1,i*(1-o)+o);returnLine truncated
*/
function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClassicEditor=e():t.ClassicEditor=e()}(self,(function(){return function(){var t,e,n={5659:function(t,e,n){const i=n(8156),o={};for(const t of Object.keys(i))o[i[t]]=t;const r={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};t.exports=r;for(const t of Object.keys(r)){if(!("channels"in r[t]))throw new Error("missing channels property: "+t);if(!("labels"in r[t]))throw new Error("missing channel labels property: "+t);if(r[t].labels.length!==r[t].channels)throw new Error("channel and label counts mismatch: "+t);const{channels:e,labels:n}=r[t];delete r[t].channels,delete r[t].labels,Object.defineProperty(r[t],"channels",{value:e}),Object.defineProperty(r[t],"labels",{value:n})}r.rgb.hsl=function(t){const e=t[0]/255,n=t[1]/255,i=t[2]/255,o=Math.min(e,n,i),r=Math.max(e,n,i),s=r-o;let a,c;r===o?a=0:e===r?a=(n-i)/s:n===r?a=2+(i-e)/s:i===r&&(a=4+(e-n)/s),a=Math.min(60*a,360),a<0&&(a+=360);const l=(o+r)/2;return c=r===o?0:l<=.5?s/(r+o):s/(2-r-o),[a,100*c,100*l]},r.rgb.hsv=function(t){let e,n,i,o,r;const s=t[0]/255,a=t[1]/255,c=t[2]/255,l=Math.max(s,a,c),d=l-Math.min(s,a,c),u=function(t){return(l-t)/6/d+.5};return 0===d?(o=0,r=0):(r=d/l,e=u(s),n=u(a),i=u(c),s===l?o=i-n:a===l?o=1/3+e-i:c===l&&(o=2/3+n-e),o<0?o+=1:o>1&&(o-=1)),[360*o,100*r,100*l]},r.rgb.hwb=function(t){const e=t[0],n=t[1];let i=t[2];const o=r.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(n,i));return i=1-1/255*Math.max(e,Math.max(n,i)),[o,100*s,100*i]},r.rgb.cmyk=function(t){const e=t[0]/255,n=t[1]/255,i=t[2]/255,o=Math.min(1-e,1-n,1-i);return[100*((1-e-o)/(1-o)||0),100*((1-n-o)/(1-o)||0),100*((1-i-o)/(1-o)||0),100*o]},r.rgb.keyword=function(t){const e=o[t];if(e)return e;let n,r=1/0;for(const e of Object.keys(i)){const o=i[e],c=(a=o,((s=t)[0]-a[0])**2+(s[1]-a[1])**2+(s[2]-a[2])**2);c<r&&(r=c,n=e)}var s,a;return n},r.keyword.rgb=function(t){return i[t]},r.rgb.xyz=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;return[100*(.4124*e+.3576*n+.1805*i),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},r.rgb.lab=function(t){const e=r.rgb.xyz(t);let n=e[0],i=e[1],o=e[2];n/=95.047,i/=100,o/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;return[116*i-16,500*(n-i),200*(i-o)]},r.hsl.rgb=function(t){const e=t[0]/360,n=t[1]/100,i=t[2]/100;let o,r,s;if(0===n)return s=255*i,[s,s,s];o=i<.5?i*(1+n):i+n-i*n;const a=2*i-o,c=[0,0,0];for(let t=0;t<3;t++)r=e+1/3*-(t-1),r<0&&r++,r>1&&r--,s=6*r<1?a+6*(o-a)*r:2*r<1?o:3*r<2?a+(o-a)*(2/3-r)*6:a,c[t]=255*s;return c},r.hsl.hsv=function(t){const e=t[0];let n=t[1]/100,i=t[2]/100,o=n;const r=Math.max(i,.01);i*=2,n*=i<=1?i:2-i,o*=r<=1?r:2-r;return[e,100*(0===i?2*o/(r+o):2*n/(i+n)),100*((i+n)/2)]},r.hsv.rgb=function(t){const e=t[0]/60,n=t[1]/100;let i=t[2]/100;const o=Math.floor(e)%6,r=e-Math.floor(e),s=255*i*(1-n),a=255*i*(1-n*r),c=255*i*(1-n*(1-r));switch(i*=255,o){case 0:return[i,c,s];case 1:return[a,i,s];case 2:return[s,i,c];case 3:return[s,a,i];case 4:return[c,s,i];case 5:return[i,s,a]}},r.hsv.hsl=function(t){const e=t[0],n=t[1]/100,i=t[2]/100,o=Math.max(i,.01);let r,s;s=(2-n)*i;const a=(2-n)*o;return r=n*o,r/=a<=1?a:2-a,r=r||0,s/=2,[e,100*r,100*s]},r.hwb.rgb=function(t){const e=t[0]/360;let n=t[1]/100,i=t[2]/100;const o=n+i;let r;o>1&&(n/=o,i/=o);const s=Math.floor(6*e),a=1-i;r=6*e-s,1&s&&(r=1-r);const c=n+r*(a-n);let l,d,u;switch(s){default:case 6:case 0:l=a,d=c,u=n;break;case 1:l=c,d=a,u=n;break;case 2:l=n,d=a,u=c;break;case 3:l=n,d=c,u=a;break;case 4:l=c,d=n,u=a;break;case 5:l=a,d=n,u=c}return[255*l,255*d,255*u]},r.cmyk.rgb=function(t){const e=t[0]/100,n=t[1]/100,i=t[2]/100,o=t[3]/100;return[255*(1-Math.min(1,e*(1-o)+o)),255*(1-Math.min(1,n*(1-o)+o)),255*(1-Math.min(1,i*(1-o)+o))]},r.xyz.rgb=function(t){const e=t[0]/100,n=t[1]/100,i=t[2]/100;let o,r,s;return o=3.2406*e+-1.5372*n+-.4986*i,r=-.9689*e+1.8758*n+.0415*i,s=.0557*e+-.204*n+1.057*i,o=o>.0031308?1.055*o**(1/2.4)-.055:12.92*o,r=r>.0031308?1.055*r**(1/2.4)-.055:12.92*r,s=s>.0031308?1.055*s**(1/2.4)-.055:12.92*s,o=Math.min(Math.max(0,o),1),r=Math.min(Math.max(0,r),1),s=Math.min(Math.max(0,s),1),[255*o,255*r,255*s]},r.xyz.lab=function(t){let e=t[0],n=t[1],i=t[2];e/=95.047,n/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,iLine truncated
//# sourceMappingURL=ckeditor.js.map
@@ -1 +1 @@
{"version":3,"file":"ckeditor.js","mappings":";;;;AAAA","sources":["webpack://ClassicEditor/webpack/universalModuleDefinition"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClassicEditor\"] = factory();\n\telse\n\t\troot[\"ClassicEditor\"] = factory();\n})(self, () => {\nreturn "],"names":[],"sourceRoot":""}
{"version":3,"file":"ckeditor.js","mappings":"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 truncated
@@ -1 +1 @@
(function(e){const t=e["af"]=e["af"]||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"%0 van %1","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Block quote":"Verwysingsaanhaling",Bold:"Vet","Bold text":"",Cancel:"Kanselleer",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Content editing keystrokes":"","Execute the currently focused button":"","Insert code block":"Voeg bronkodeblok in",Italic:"Kursief","Italic text":"",Justify:"Belyn beide kante","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","Open the accessibility help dialog":"","Plain text":"Gewone skrif","Remove color":"Verwyder kleur","Remove Format":"Verwyder formatering","Restore default":"Herstel verstek",Save:"Stoor","Show more items":"Wys meer items",Strikethrough:"Deurstreep","Strikethrough text":"",Subscript:"Onderskrif",Superscript:"Boskrif","Text alignment":"Teksbelyning","Text alignment toolbar":"Teksbelyning nutsbank","These keyboard shortcuts allow for quick access to content editing features.":"","Toggle caption off":"","Toggle caption on":"",Underline:"Onderstreep","Underline text":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":""});t.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
!function(t){const e=t.af=t.af||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 van %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"Verwysingsaanhaling",Blue:"","Blue marker":"",Bold:"Vet","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"Kanselleer","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"","Font Color":"","Font Family":"","Font Size":"","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"","Heading 1":"","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"Voeg bronkodeblok in","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Kursief","Italic text":"",Justify:"Belyn beide kante","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Kip sign":"",Latin:"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letterLine truncated
@@ -1 +1 @@
(function(t){const e=t["ar"]=t["ar"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(قد يتطلب <kbd>مفتاح Fn</kbd>)","%0 of %1":"%0 من %1",Accept:"قبول","Accessibility help":"تعليمات إمكانية الوصول","Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين","Align table to the left":"قم بمحاذاة الجدول إلى اليسار","Align table to the right":"قم بمحاذاة الجدول إلى اليمين",Alignment:"المحاذاة",All:"الكل","Almost equal to":"يساوي على الأرجح",Angle:"علامة الزاوية","Approximately equal to":"يساوي تقريباً",Aquamarine:"أخضر زبرجد",Arrows:"أسهم","Asterisk operator":"علامة الضرب (النجمة)","Austral sign":"رمز الأسترال","back with leftwards arrow above":'"عودة" أعلاها سهم يتجه يساراً',Background:"الخلفية","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"ستجد أدناه قائمة باختصارات لوحة المفاتيح التي يمكن استخدامها في المحرِّر.",Big:"كبير","Bitcoin sign":"رمز البيتكوين",Black:"أسود","Block quote":"اقتباس",Blue:"أزرق","Blue marker":"تحديد ازرق",Bold:"عريض","Bold text":"نص غامق",Border:"الحدود","Break text":"اعتراض النص","Bulleted List":"قائمة نقطية","Bulleted list styles toolbar":"شريط أدوات أنماط قوائم التعداد النقطي",Cancel:"إلغاء","Caption for image: %0":"التسمية التوضيحية للصورة: %0","Caption for the image":"التسمية التوضيحية للصورة","Cedi sign":"رمز السيدي","Cell properties":"خصائص الخلية","Cent sign":"رمز السنت","Center table":"قم بمحاذاة الجدول إلى المنتصف","Centered image":"صورة بالوسط","Change image text alternative":"غير النص البديل للصورة","Character categories":"فئات الأحرف","Choose heading":"اختر عنوان",Circle:"دائرة",Clear:"مسح","Click to edit block":"انقر لتحرير الوحدة التجميعية",Close:"إغلاق","Close contextual balloons, dropdowns, and dialogs":"أغلقْ البالونات السياقية والقوائم المنسدلة ومربعات الحوار",Code:"شفرة برمجية","Colon sign":"رمز الكولون",Color:"اللون","Color picker":"أداة انتقاء الألوان",Column:"عمود","Contains as member":"يحتوي كعضو","Content editing keystrokes":"ضغطة المفاتيح لتحرير المحتوى","Copy selected content":"انسخْ المحتوى المحدد","Copyright sign":'علامة "حق التأليف والنشر"',"Create link":"قمْ بإنشاء رابط","Cruzeiro sign":"رمز الكروزيرو",Currency:"عملة","Currency sign":"رمز العملة",Dashed:"متقطع",Decimal:"رقم عشري","Decimal with leading zero":"رقم عشري مع البدء بصفر ","Decrease indent":"تقليص المسافة البادئة","Decrease list item indent":"تقليل المسافة البادئة لعنصر القائمة",Default:"افتراضي","Degree sign":"علامة الدرجة","Delete column":"حذف العمود","Delete row":"حذف الصف","Dim grey":"رمادي خافت",Dimensions:"الابعاد",Disc:"قرص","Division sign":"علامة القسمة","Document colors":"ألوان المستند","Dollar sign":"رمز الدولار","Dong sign":"رمز الدونغ",Dotted:"منقط",Double:"مزدوج","Double dagger":"رمز الخنجر المزدوج","Double exclamation mark":"علامة تعجّب مزدوجة","Double low-9 quotation mark":"علامة تنصيص 9 منخفضة، مزدوجة","Double question mark":"علامة استفهام مزدوجة",Downloadable:"يمكن تنزيله","downwards arrow to bar":"سهم لأسفل يشير إلى خط","downwards dashed arrow":"سهم متقطع متجه لأسفل","downwards double arrow":"سهم مزدوج متجه لأسفل","downwards simple arrow":"سهم بسيط يشير إلى الأسفل","Drachma sign":"رمز الدراخما","Drag to move":"اسحب للنقل","Dropdown toolbar":"شريط أدوات القائمة المنسدلة","EditLine truncated
!function(t){const e=t.ar=t.ar||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(قد يتطلب <kbd>مفتاح Fn</kbd>)","%0 of %1":"%0 من %1",Accept:"قبول",Accessibility:"إمكانية الوصول","Accessibility help":"تعليمات إمكانية الوصول","Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين","Align table to the left":"قم بمحاذاة الجدول إلى اليسار","Align table to the right":"قم بمحاذاة الجدول إلى اليمين",Alignment:"المحاذاة",All:"الكل","Almost equal to":"يساوي على الأرجح",Angle:"علامة الزاوية","Approximately equal to":"يساوي تقريباً",Aquamarine:"أخضر زبرجد",Arrows:"أسهم","Asterisk operator":"علامة الضرب (النجمة)","Austral sign":"رمز الأسترال","back with leftwards arrow above":'"عودة" أعلاها سهم يتجه يساراً',Background:"الخلفية","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"ستجد أدناه قائمة باختصارات لوحة المفاتيح التي يمكن استخدامها في المحرِّر.",Big:"كبير","Bitcoin sign":"رمز البيتكوين",Black:"أسود","Block quote":"اقتباس",Blue:"أزرق","Blue marker":"تحديد ازرق",Bold:"عريض","Bold text":"نص غامق",Border:"الحدود","Break text":"اعتراض النص","Bulleted List":"قائمة نقطية","Bulleted list styles toolbar":"شريط أدوات أنماط قوائم التعداد النقطي",Cancel:"إلغاء","Caption for image: %0":"التسمية التوضيحية للصورة: %0","Caption for the image":"التسمية التوضيحية للصورة",Category:"الفئة","Cedi sign":"رمز السيدي","Cell properties":"خصائص الخلية","Cent sign":"رمز السنت","Center table":"قم بمحاذاة الجدول إلى المنتصف","Centered image":"صورة بالوسط","Change image text alternative":"غير النص البديل للصورة","Choose heading":"اختر عنوان",Circle:"دائرة",Clear:"مسح","Click to edit block":"انقر لتحرير الوحدة التجميعية",Close:"إغلاق","Close contextual balloons, dropdowns, and dialogs":"أغلقْ البالونات السياقية والقوائم المنسدلة ومربعات الحوار",Code:"شفرة برمجية","Code block":"كتلة تعليمات برمجية","Colon sign":"رمز الكولون",Color:"اللون","Color picker":"أداة انتقاء الألوان",Column:"عمود","Contains as member":"يحتوي كعضو","Content editing keystrokes":"ضغطة المفاتيح لتحرير المحتوى","Copy selected content":"انسخْ المحتوى المحدد","Copyright sign":'علامة "حق التأليف والنشر"',"Create link":"قمْ بإنشاء رابط","Cruzeiro sign":"رمز الكروزيرو",Currency:"عملة","Currency sign":"رمز العملة",Custom:"مخصص","Custom image size":"حجم مخصص للصورة",Dashed:"متقطع",Decimal:"رقم عشري","Decimal with leading zero":"رقم عشري مع البدء بصفر ","Decrease indent":"تقليص المسافة البادئة","Decrease list item indent":"تقليل المسافة البادئة لعنصر القائمة",Default:"افتراضي","Degree sign":"علامة الدرجة","Delete column":"حذف العمود","Delete row":"حذف الصف","Dim grey":"رمادي خافت",Dimensions:"الابعاد",Disc:"قرص","Division sign":"علامة القسمة","Document colors":"ألوان المستند","Dollar sign":"رمز الدولار","Dong sign":"رمز الدونغ",Dotted:"منقط",Double:"مزدوج","Double dagger":"رمز الخنجر المزدوج","Double exclamation mark":"علامة تعجّب مزدوجة","Double low-9 quotation mark":"علامة تنصيص 9 منخفضة، مزدوجة","Double question mark":"علامة استفهام مزدوجة",Downloadable:"يمكن تنزيله","downwards arrow to bar":"سهم لأسفل يشير إلى خط","downwards dashed arrow":"سهم متقطع متجه لأسفل","downwards double arrow":"سهم مزدوج متجه لأسفل","downwards simple arrow":"سهم بسيط يشير إلى الأسفل","Drachma sign":"رمزLine truncated
@@ -1 +1 @@
(function(e){const t=e["ast"]=e["ast"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"","Accessibility help":"",Aquamarine:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Black:"",Blue:"",Bold:"Negrina","Bold text":"","Break text":"","Bulleted List":"Llista con viñetes","Bulleted list styles toolbar":"",Cancel:"Encaboxar","Caption for image: %0":"","Caption for the image":"","Centered image":"","Change image text alternative":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Content editing keystrokes":"","Create link":"",Decimal:"","Decimal with leading zero":"","Decrease list item indent":"","Dim grey":"",Disc:"",Downloadable:"","Drag to move":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"","Enter image caption":"","Execute the currently focused button":"","Full size image":"Imaxen a tamañu completu",Green:"",Grey:"","Help Contents. To close this dialog press ESC.":"",HEX:"","Image resize list":"","Image toolbar":"","image widget":"complementu d'imaxen","In line":"","Increase list item indent":"",Insert:"","Insert image":"","Insert image via URL":"","Invalid start index value.":"",Italic:"Cursiva","Italic text":"","Keystrokes that can be used in a list":"","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"Enllazar","Link image":"","Link URL":"URL del enllaz","List properties":"","Lower-latin":"","Lower–roman":"","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Navigate through the toolbar":"",Next:"","No results found":"","No searchable items":"","Numbered List":"Llista numberada","Numbered list styles toolbar":"","Open in a new tab":"","Open link in new tab":"","Open the accessibility help dialog":"",Orange:"",Original:"","Press %0 for help.":"",Previous:"",Purple:"",Red:"",Redo:"Refacer","Remove color":"","Replace from computer":"","Replace image":"","Replace image from computer":"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Restore default":"","Reversed order":"","Rich Text Editor":"Editor de testu arriquecíu","Right aligned image":"",Save:"Guardar","Show more items":"","Side image":"Imaxen llateral",Square:"","Start at":"","Start index must be greater than 0.":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"","Text alternative":"","These keyboard shortcuts allow for quick access to content editing features.":"","This link has no URL":"","To-do List":"","Toggle caption off":"","Toggle caption on":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"",Turquoise:"",Underline:"","Underline text":"",Undo:"Desfacer",Unlink:"Desenllazar",Update:"","Update image URL":"","Upload failed":"","Upload from computer":"","Upload image from computer":"","Upper-latin":"","Upper-roman":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":"",White:"","Wrap text":"",Yellow:""});t.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
!function(t){const e=t.ast=t.ast||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"","Align left":"","Align right":"","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"",Blue:"","Blue marker":"",Bold:"Negrina","Bold text":"",Border:"","Break text":"","Bulleted List":"Llista con viñetes","Bulleted list styles toolbar":"",Cancel:"Encaboxar","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"","Font Color":"","Font Family":"","Font Size":"","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Imaxen a tamañu completu","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"","Heading 1":"","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"complementu d'imaxen","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Cursiva","Italic text":"",Justify:"","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Kip sign":"",Latin:"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c wiLine truncated
@@ -1 +1 @@
(function(t){const e=t["az"]=t["az"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%1-dən %0",Accept:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"Akvamarin",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"Fon","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Böyük","Bitcoin sign":"",Black:"Qara","Block quote":"Sitat bloku",Blue:"Mavi","Blue marker":"Mavi marker",Bold:"Yarıqalın","Bold text":"",Border:"Sərhəd","Break text":"","Bulleted List":"Markerlənmiş siyahı","Bulleted list styles toolbar":"",Cancel:"İmtina et","Caption for image: %0":"","Caption for the image":"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Mərkəzə düzləndir","Change image text alternative":"Alternativ mətni redaktə et","Character categories":"","Choose heading":"Başlıqı seç",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Colon sign":"",Color:"Rəng","Color picker":"",Column:"Sütun","Contains as member":"","Content editing keystrokes":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"Boş yeri kiçilt","Decrease list item indent":"",Default:"Default","Degree sign":"","Delete column":"Sütunları sil","Delete row":"Sətirləri sil","Dim grey":"Tünd boz",Dimensions:"Ölçülər",Disc:"","Division sign":"","Document colors":"Rənglər","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"Yüklənə bilər","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"aşağı ikiqat ox","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown toolbar":"Açılan paneli","Edit block":"Redaktə etmək bloku","Edit link":"Linki redaktə et","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"Redaktorun paneli","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"Şəkil başlığı daxil edin","Enter table caption":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button":"","Font Background Color":"Şrift Fonunun Rəngi","Font Color":"Şrift Rəngi","Font Family":"Şrift ailəsi","Font Size":"Şrift ölçüsü","For all":"","Fraction slash":"","French franc sign":"","Full size image":"Tam ölçülü şəkili","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"Yaşıl","Green marker":"Yaşıl marker","Green pen":"Yaşıl qələm",Grey:"Boz",Groove:"","Guarani sign":"","Header column":"Başlıqlı sütun","Header row":"Başlıqlı sətir",Heading:"Başlıq","Heading 1":"Başlıq 1","Heading 2":"Başlıq 2","Heading 3":"Başlıq 3","Heading 4":"Başlıq 4","Heading 5":"Başlıq 5","Heading 6":"Başlıq 6",Height:"Hündürlük","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Vurğulamaq","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"",Huge:"Nəhəng","Identical to":"","Image resize list":"","Image toolbar":"Şəkil paneli","image widget":"Şəkil vidgetı","In line":"","Increase indent":"Boş yeri böyüt","Increase list item indent":"","Indian rupee sign":"",Infinity:"",Insert:"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert code block":"Kod blokunu əlavə et","Insert column left":"Sola sütun əlavə et","Insert column right":"Sağa sütun əlavə et","Insert image":"Şəkili əlavə et","Insert image via URL":"","Insert media":"Media əlavə ed","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"Aşağıya sətir əlavə et","Insert row below":"Yuxarıya sətir əlavə et","Insert table":"Cədvəli əlavə et",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Maili","Italic text":"",Justify:"Eninə görə","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that canLine truncated
!function(t){const e=t.az=t.az||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%1-dən %0",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"Akvamarin",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"Fon","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Böyük","Bitcoin sign":"",Black:"Qara","Block quote":"Sitat bloku",Blue:"Mavi","Blue marker":"Mavi marker",Bold:"Yarıqalın","Bold text":"",Border:"Sərhəd","Break text":"","Bulleted List":"Markerlənmiş siyahı","Bulleted list styles toolbar":"",Cancel:"İmtina et","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Mərkəzə düzləndir","Change image text alternative":"Alternativ mətni redaktə et","Choose heading":"Başlıqı seç",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Code block":"","Colon sign":"",Color:"Rəng","Color picker":"",Column:"Sütun","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"Boş yeri kiçilt","Decrease list item indent":"",Default:"Default","Degree sign":"","Delete column":"Sütunları sil","Delete row":"Sətirləri sil","Dim grey":"Tünd boz",Dimensions:"Ölçülər",Disc:"","Division sign":"","Document colors":"Rənglər","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"Yüklənə bilər","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"aşağı ikiqat ox","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"Açılan paneli","Edit block":"Redaktə etmək bloku","Edit link":"Linki redaktə et","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"Redaktorun paneli","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"Şəkil başlığı daxil edin","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Şrift Fonunun Rəngi","Font Color":"Şrift Rəngi","Font Family":"Şrift ailəsi","Font Size":"Şrift ölçüsü","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Tam ölçülü şəkili","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"Yaşıl","Green marker":"Yaşıl marker","Green pen":"Yaşıl qələm",Grey:"Boz",Groove:"","Guarani sign":"","Header column":"Başlıqlı sütun","Header row":"Başlıqlı sətir",Heading:"Başlıq","Heading 1":"Başlıq 1","Heading 2":"Başlıq 2","Heading 3":"Başlıq 3","Heading 4":"Başlıq 4","Heading 5":"Başlıq 5","Heading 6":"Başlıq 6",Height:"Hündürlük","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Vurğulamaq","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"Nəhəng","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"Şəkil paneli","Image upload complete":"","Image via URL":"","image widget":"Şəkil vidgetı","In line":"","Increase indent":"Boş yeri böyüt","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"Kod blokunu əlavə et","Insert column left":"Sola sütun əlavə et","Insert column right":"Sağa sütun əlavə et","Insert HTML":"","Insert image":"Şəkili əlavə et","InLine truncated
@@ -1 +1 @@
(function(t){const e=t["bg"]=t["bg"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(може да изисква <kbd>Fn</kbd>)","%0 of %1":"%0 от %1",Accept:"Приемане","Accessibility help":"Помощ за достъпност","Align cell text to the bottom":"Подравни текста в клетката към дъното","Align cell text to the center":"Подравни текста в клетката централно","Align cell text to the left":"Подравни текста в клетката наляво","Align cell text to the middle":"Подравни текста в клетката към средата","Align cell text to the right":"Подравни текста в клетката надясно","Align cell text to the top":"Подравни текста в клетката нагоре","Align center":"Централно подравняване","Align left":"Ляво подравняване","Align right":"Дясно подравняване","Align table to the left":"Подравни таблицата наляво","Align table to the right":"Подравни таблицата надясно",Alignment:"Подравняване",All:"Всички","Almost equal to":"Почти равно на",Angle:"Ъгъл","Approximately equal to":"Приблизително равно на",Aquamarine:"Аквамарин",Arrows:"Стрелки","Asterisk operator":"Оператор звездичка","Austral sign":"Символ на аустрал","back with leftwards arrow above":"назад със стрелка наляво отгоре",Background:"Фон","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Долу можете да намерите списък от клавишни комбинации, които могат да се използват в редактора.",Big:"Едър","Bitcoin sign":"Символ на Биткойн",Black:"Черен","Block quote":"Цитат",Blue:"Син","Blue marker":"Син маркер",Bold:"Удебелен","Bold text":"Почернен текст",Border:"Граница","Break text":"Раздели текст","Bulleted List":"Водещи символи","Bulleted list styles toolbar":"Лента със стилове за подточки",Cancel:"Отказ","Caption for image: %0":"Заглавие на изображението: %0","Caption for the image":"Заглавие на изображението","Cedi sign":"Символ Седи","Cell properties":"Свойства на клетки","Cent sign":"Символ на цент","Center table":"Центрирай таблицата","Centered image":"Центрирано изображение","Change image text alternative":"Промени изображението на текстовата алтернатива","Character categories":"Категории символи","Choose heading":"Избери заглавие",Circle:"Кръг",Clear:"Изчисти","Click to edit block":"Кликнете, за да редактирате блок",Close:"Затвори","Close contextual balloons, dropdowns, and dialogs":"Затваряне на балоните с контекст, падащите менюта и диалогови прозорци",Code:"Код","Colon sign":"Символ двоеточие",Color:"Цвят","Color picker":"Избор на цвят",Column:"Колона","Contains as member":"Съдържа като член","Content editing keystrokes":"Клавишни комбинации за редактиране на съдържание","Copy selected content":"Копиране на избраното съдържание","Copyright sign":"Знак за авторски права","Create link":"Създаване на линк","Cruzeiro sign":"Символ Крузейро",Currency:"Валутни символи","Currency sign":"Символ на валута",Dashed:"На черти",Decimal:"Десетичен","Decimal with leading zero":"Десетичен с водеща нула","Decrease indent":"Намали отстъпа","Decrease list item indent":"Намаляване на шрифта на елемент от списъка",Default:"По подразбиране","Degree sign":"Знак за степен","Delete column":"Изтриване на колона","Delete row":"Изтриване на ред","Dim grey":"Тъмно сив",Dimensions:"Размери",Disc:"Диск","Division sign":"Знак за деление","Document colors":"Цвят на документа","Dollar sign":"Символ на долар","Dong sign":"Символ на донг",Dotted:"На точки",Double:"Двоен","Double dagger":"Двойна кама","Double exclamation mark":"Двоен удивителен знак","Double low-9 quotation mark":"Двойна ниска 9-кавичка","Double question mark":"Двоен въпросLine truncated
!function(t){const e=t.bg=t.bg||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(може да изисква <kbd>Fn</kbd>)","%0 of %1":"%0 от %1",Accept:"Приемане",Accessibility:"Достъпност","Accessibility help":"Помощ за достъпност","Align cell text to the bottom":"Подравни текста в клетката към дъното","Align cell text to the center":"Подравни текста в клетката централно","Align cell text to the left":"Подравни текста в клетката наляво","Align cell text to the middle":"Подравни текста в клетката към средата","Align cell text to the right":"Подравни текста в клетката надясно","Align cell text to the top":"Подравни текста в клетката нагоре","Align center":"Централно подравняване","Align left":"Ляво подравняване","Align right":"Дясно подравняване","Align table to the left":"Подравни таблицата наляво","Align table to the right":"Подравни таблицата надясно",Alignment:"Подравняване",All:"Всички","Almost equal to":"Почти равно на",Angle:"Ъгъл","Approximately equal to":"Приблизително равно на",Aquamarine:"Аквамарин",Arrows:"Стрелки","Asterisk operator":"Оператор звездичка","Austral sign":"Символ на аустрал","back with leftwards arrow above":"назад със стрелка наляво отгоре",Background:"Фон","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Долу можете да намерите списък от клавишни комбинации, които могат да се използват в редактора.",Big:"Едър","Bitcoin sign":"Символ на Биткойн",Black:"Черен","Block quote":"Цитат",Blue:"Син","Blue marker":"Син маркер",Bold:"Удебелен","Bold text":"Почернен текст",Border:"Граница","Break text":"Раздели текст","Bulleted List":"Водещи символи","Bulleted list styles toolbar":"Лента със стилове за подточки",Cancel:"Отказ","Caption for image: %0":"Заглавие на изображението: %0","Caption for the image":"Заглавие на изображението",Category:"Категория","Cedi sign":"Символ Седи","Cell properties":"Свойства на клетки","Cent sign":"Символ на цент","Center table":"Центрирай таблицата","Centered image":"Центрирано изображение","Change image text alternative":"Промени изображението на текстовата алтернатива","Choose heading":"Избери заглавие",Circle:"Кръг",Clear:"Изчисти","Click to edit block":"Кликнете, за да редактирате блок",Close:"Затвори","Close contextual balloons, dropdowns, and dialogs":"Затваряне на балоните с контекст, падащите менюта и диалогови прозорци",Code:"Код","Code block":"Кодов блок","Colon sign":"Символ двоеточие",Color:"Цвят","Color picker":"Избор на цвят",Column:"Колона","Contains as member":"Съдържа като член","Content editing keystrokes":"Клавишни комбинации за редактиране на съдържание","Copy selected content":"Копиране на избраното съдържание","Copyright sign":"Знак за авторски права","Create link":"Създаване на линк","Cruzeiro sign":"Символ Крузейро",Currency:"Валутни символи","Currency sign":"Символ на валута",Custom:"Потребителски","Custom image size":"Потребителски размер на изображението",Dashed:"На черти",Decimal:"Десетичен","Decimal with leading zero":"Десетичен с водеща нула","Decrease indent":"Намали отстъпа","Decrease list item indent":"Намаляване на шрифта на елемент от списъка",Default:"По подразбиране","Degree sign":"Знак за степен","Delete column":"Изтриване на колона","Delete row":"Изтриване на ред","Dim grey":"Тъмно сив",Dimensions:"Размери",Disc:"Диск","Division sign":"Знак за деление","Document colors":"Цвят на документа","Dollar sign":"Символ на долар","Dong sign":"Символ на донг",Dotted:"На точки",Double:"Двоен","Double dagger":"Двойна кама","Double exclamation marLine truncated
@@ -1 +1 @@
(function(t){const e=t["bn"]=t["bn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(<kbd>Fn[</kbd>] এর প্রয়োজন হতে পারে)","%0 of %1":"%0 এর %1",Accept:"গ্রহণ করুন","Accessibility help":"প্রবেশযোগ্যতা জন্য সহায়তা","Align cell text to the bottom":"নীচে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the center":"কেন্দ্রে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the left":"বাম দিকে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the middle":"মাঝখানে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the right":"ডানদিকে সেল টেক্সট সারিবদ্ধ করুন ","Align cell text to the top":"শীর্ষে সেল টেক্সট সারিবদ্ধ করুন","Align center":"কেন্দ্র সারিবদ্ধ করুন","Align left":"বামে সারিবদ্ধ করুন","Align right":"ডানদিকে সারিবদ্ধ করুন","Align table to the left":"বাম দিকে টেবিল সারিবদ্ধ করুন","Align table to the right":"ডানদিকে টেবিলটি সারিবদ্ধ করুন",Alignment:"সারিবদ্ধকরণ",All:"সকল","Almost equal to":"প্রায় সমান",Angle:"কোণ","Approximately equal to":"প্রায় সমান",Aquamarine:"ফেকাশে সবুজবর্ণ",Arrows:"তীর","Asterisk operator":"অস্ট্রিক অপারেটর","Austral sign":"অস্ট্রাল চিহ্ন","back with leftwards arrow above":"ব্যাক এর উপরে বামমুখী তীর",Background:"ব্যাকগ্রাউন্ড","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"এডিটরে ব্যবহার করা যেতে পারে এমন কীবোর্ড শর্টকাটগুলির একটি তালিকা আপনি নিচে দেখতে পাবেন।",Big:"বড়","Bitcoin sign":"বিটকয়েনের চিহ্ন",Black:"কালো","Block quote":"ব্লক কোট",Blue:"নীল ","Blue marker":"নীল মার্কার",Bold:"বোল্ড","Bold text":"বোল্ড টেক্সট",Border:"বর্ডার ","Break text":"টেক্সট ভেঙ্গে ফেলুন","Bulleted List":"বুলেটযুক্ত তালিকা","Bulleted list styles toolbar":"বুলেটেড তালিকা স্টাইল টুলবার",Cancel:"বাতিল করুন","Caption for image: %0":"ছবির জন্য ক্যাপশন: %0","Caption for the image":"ছবির জন্য ক্যাপশন","Cedi sign":"সেডি চিহ্ন","Cell properties":"সেল বৈশিষ্ট্য","Cent sign":"সেন্ট চিহ্ন","Center table":"কেন্দ্রের টেবিল","Centered image":"কেন্দ্রীভূত ছবি","Change image text alternative":"ছবির টেক্সট বিকল্প পরিবর্তন","Character categories":"অক্ষরের শ্রেণীবিভাগসমূহ","Choose heading":"শিরোনাম নির্বাচন করুন",Circle:"বৃত্ত",Clear:"পরিষ্কার করুন","Click to edit block":"ব্লক এডিট করতে ক্লিক করুন",Close:"বন্ধ করুন","Close contextual balloons, dropdowns, and dialogs":"কন্টেক্সচুয়াল বেলুন, ড্রপডাউন এবং ডায়ালগগুলি বন্ধ করুন",Code:"কোড","Colon sign":"কোলন চিহ্ন",Color:" রং","Color picker":"রং বাছাইকারী",Column:"কলাম","Contains as member":"সদস্য হিসেবে রয়েছে","Content editing keystrokes":"কনটেন্ট এডিটিংয়ের কীস্ট্রোকগুলি","Copy selected content":"সিলেক্ট করা কন্টেন্ট কপি করুন","Copyright sign":"কপিরাইট চিহ্ন","Create link":"লিঙ্ক তৈরি করুন","Cruzeiro sign":"ত্রুুজেইরো চিহ্ন",Currency:"মুদ্রা","Currency sign":"মুদ্রার চিহ্ন",Dashed:"ড্যাশড",Decimal:"দশমিক","Decimal with leading zero":"অগ্রণী 0 সহ দশমিক ","Decrease indent":"ইন্ডেন্ট হ্রাস Line truncated
!function(t){const e=t.bn=t.bn||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(<kbd>Fn[</kbd>] এর প্রয়োজন হতে পারে)","%0 of %1":"%0 এর %1",Accept:"গ্রহণ করুন",Accessibility:"প্রবেশযোগ্যতা","Accessibility help":"প্রবেশযোগ্যতা জন্য সহায়তা","Align cell text to the bottom":"নীচে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the center":"কেন্দ্রে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the left":"বাম দিকে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the middle":"মাঝখানে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the right":"ডানদিকে সেল টেক্সট সারিবদ্ধ করুন ","Align cell text to the top":"শীর্ষে সেল টেক্সট সারিবদ্ধ করুন","Align center":"কেন্দ্র সারিবদ্ধ করুন","Align left":"বামে সারিবদ্ধ করুন","Align right":"ডানদিকে সারিবদ্ধ করুন","Align table to the left":"বাম দিকে টেবিল সারিবদ্ধ করুন","Align table to the right":"ডানদিকে টেবিলটি সারিবদ্ধ করুন",Alignment:"সারিবদ্ধকরণ",All:"সকল","Almost equal to":"প্রায় সমান",Angle:"কোণ","Approximately equal to":"প্রায় সমান",Aquamarine:"ফেকাশে সবুজবর্ণ",Arrows:"তীর","Asterisk operator":"অস্ট্রিক অপারেটর","Austral sign":"অস্ট্রাল চিহ্ন","back with leftwards arrow above":"ব্যাক এর উপরে বামমুখী তীর",Background:"ব্যাকগ্রাউন্ড","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"এডিটরে ব্যবহার করা যেতে পারে এমন কীবোর্ড শর্টকাটগুলির একটি তালিকা আপনি নিচে দেখতে পাবেন।",Big:"বড়","Bitcoin sign":"বিটকয়েনের চিহ্ন",Black:"কালো","Block quote":"ব্লক কোট",Blue:"নীল ","Blue marker":"নীল মার্কার",Bold:"বোল্ড","Bold text":"বোল্ড টেক্সট",Border:"বর্ডার ","Break text":"টেক্সট ভেঙ্গে ফেলুন","Bulleted List":"বুলেটযুক্ত তালিকা","Bulleted list styles toolbar":"বুলেটেড তালিকা স্টাইল টুলবার",Cancel:"বাতিল করুন","Caption for image: %0":"ছবির জন্য ক্যাপশন: %0","Caption for the image":"ছবির জন্য ক্যাপশন",Category:"ক্যাটাগরি","Cedi sign":"সেডি চিহ্ন","Cell properties":"সেল বৈশিষ্ট্য","Cent sign":"সেন্ট চিহ্ন","Center table":"কেন্দ্রের টেবিল","Centered image":"কেন্দ্রীভূত ছবি","Change image text alternative":"ছবির টেক্সট বিকল্প পরিবর্তন","Choose heading":"শিরোনাম নির্বাচন করুন",Circle:"বৃত্ত",Clear:"পরিষ্কার করুন","Click to edit block":"ব্লক এডিট করতে ক্লিক করুন",Close:"বন্ধ করুন","Close contextual balloons, dropdowns, and dialogs":"কন্টেক্সচুয়াল বেলুন, ড্রপডাউন এবং ডায়ালগগুলি বন্ধ করুন",Code:"কোড","Code block":"কোড ব্লক","Colon sign":"কোলন চিহ্ন",Color:" রং","Color picker":"রং বাছাইকারী",Column:"কলাম","Contains as member":"সদস্য হিসেবে রয়েছে","Content editing keystrokes":"কনটেন্ট এডিটিংয়ের কীস্ট্রোকগুলি","Copy selected content":"সিলেক্ট করা কন্টেন্ট কপি করুন","Copyright sign":"কপিরাইট চিহ্ন","Create link":"লিঙ্ক তৈরি করুন","Cruzeiro sign":"ত্রুুজেইরো চিহ্ন",Currency:"মুদ্রা","Currency sign":"মুদ্রার চিহ্ন",Custom:"কাস্টম","Custom image size":"কাস্টম ইমেজ সাইজ",Dashed:"ড্যাশড",Decimal:"দশমিক","DecimaLine truncated
@@ -1 +1 @@
(function(e){const a=e["bs"]=e["bs"]||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"%0 od %1","Align center":"Centrirati","Align left":"Lijevo poravnanje","Align right":"Desno poravnanje",Big:"","Block quote":"Citat",Bold:"Podebljano","Bold text":"","Break text":"",Cancel:"Poništi","Caption for image: %0":"","Caption for the image":"","Centered image":"Centrirana slika","Change image text alternative":"Promijeni ALT atribut za sliku","Choose heading":"Odaberi naslov",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Content editing keystrokes":"",Default:"Zadani","Document colors":"","Edit source":"Uredi izvor","Empty snippet content":"HTML odlomak nema sadžaj","Enter image caption":"Unesi naziv slike","Execute the currently focused button":"","Font Background Color":"Boja pozadine","Font Color":"Boja","Font Family":"Font","Font Size":"Veličina fonta","Full size image":"",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6","HTML snippet":"HTML odlomak",Huge:"","Image resize list":"Lista veličina slike","Image toolbar":"","image widget":"","In line":"",Insert:"Umetni","Insert code block":"Umetni kod blok","Insert HTML":"Umetni HTML","Insert image":"Umetni sliku","Insert image via URL":"Umetni sliku preko URLa",Italic:"Zakrivljeno","Italic text":"",Justify:"","Left aligned image":"Lijevo poravnata slika","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","No preview available":"Pregled nedostupan","Open the accessibility help dialog":"",Original:"Original",Paragraph:"Paragraf","Paste raw HTML here...":"Zalijepi HTML ovdje...","Plain text":"Tekst","Remove color":"Ukloni boju","Replace from computer":"","Replace image":"","Replace image from computer":"","Resize image":"Promijeni veličinu slike","Resize image to %0":"","Resize image to the original size":"Postavi originalnu veličinu slike","Restore default":"Vrati na zadano","Right aligned image":"Desno poravnata slika",Save:"Sačuvaj","Save changes":"Sačuvaj izmjene","Show more items":"Prikaži više stavki","Side image":"",Small:"",Strikethrough:"Precrtano","Strikethrough text":"",Subscript:"",Superscript:"","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje teksta","Text alternative":"ALT atribut","These keyboard shortcuts allow for quick access to content editing features.":"",Tiny:"","Toggle caption off":"","Toggle caption on":"","Type or paste your content here.":"Unesite ili zalijepite vaš sadržaj ovdje","Type your title":"Unesite naslov",Underline:"Podcrtano","Underline text":"",Update:"Ažuriraj","Update image URL":"Ažuriraj URL slike","Upload failed":"Učitavanje slike nije uspjelo","Upload from computer":"","Upload image from computer":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":"","Wrap text":"Prelomi tekst"});a.getPluralForm=function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
!function(t){const e=t.bs=t.bs||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 od %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Centrirati","Align left":"Lijevo poravnanje","Align right":"Desno poravnanje","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"Citat",Blue:"","Blue marker":"",Bold:"Podebljano","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"Poništi","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Centrirana slika","Change image text alternative":"Promijeni ALT atribut za sliku","Choose heading":"Odaberi naslov",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"Zadani","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"Uredi izvor","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"HTML odlomak nema sadžaj","En dash":"","end with leftwards arrow above":"","Enter image caption":"Unesi naziv slike","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Boja pozadine","Font Color":"Boja","Font Family":"Font","Font Size":"Veličina fonta","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"HTML odlomak",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"Lista veličina slike","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"Umetni kod blok","Insert column left":"","Insert column right":"","Insert HTML":"Umetni HTML","Insert image":"Umetni sliku","Insert image via URL":"Umetni sliku preko URLa","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Zakrivljeno","Italic text":"",Justify:"","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"Line truncated
@@ -1 +1 @@
(function(a){const e=a["ca"]=a["ca"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(pot requerir <kbd>Fn</kbd>))","%0 of %1":"%0 de %1",Accept:"Accepta","Accessibility help":"Ajuda d'accessibilitat","Align cell text to the bottom":"Alinear el text de la cel·la a la part inferior","Align cell text to the center":"Alinear el text de la cel·la al centre","Align cell text to the left":"Alinear el text de la cel·la a l'esquerra","Align cell text to the middle":"Alinear el text de la cel·la al centre","Align cell text to the right":"Alinear el text de la cel·la a la dreta","Align cell text to the top":"Alinear el text de la cel·la a la part superior","Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta","Align table to the left":"Alinear la taula a l'esquerra","Align table to the right":"Alinear la taula a la dreta",Alignment:"Alineació",All:"Tot","Almost equal to":"Gairebé igual a",Angle:"Angle","Approximately equal to":"Aproximadament igual a",Aquamarine:"Aiguamarina",Arrows:"Fletxes","Asterisk operator":"Operador d'asterisc","Austral sign":"signe de l'austral","back with leftwards arrow above":"back amb fletxa cap a l'esquerra per sobre",Background:"Fons","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Sota hi trobareu un llistat de dreceres del teclat que podeu emprar amb aquest editor.",Big:"Gran","Bitcoin sign":"signe del bitcoin",Black:"Negre","Block quote":"Cita de bloc",Blue:"Blau","Blue marker":"Marcador blau",Bold:"Negreta","Bold text":"Text en negreta",Border:"Vora","Break text":"Partir el text","Bulleted List":"Llista amb vinyetes","Bulleted list styles toolbar":"Barra d'eines d'estils de llista amb vinyetes",Cancel:"Cancel·lar","Caption for image: %0":"Peu de foto: %0","Caption for the image":"Peu de foto","Cedi sign":"ok","Cell properties":"Propietats de la cel·la","Cent sign":"signe del cèntim","Center table":"Centrar la taula","Centered image":"Imatge centrada","Change image text alternative":"Canviar l'alternativa del text de la imatge","Character categories":"Categories de caràcters","Choose heading":"Escull capçalera",Circle:"Cercle",Clear:"Esborra","Click to edit block":"Fes clic per editar el bloc",Close:"Tanca","Close contextual balloons, dropdowns, and dialogs":"Tanca finestres contextuals, desplegables i diàlegs",Code:"Codi","Colon sign":"signe del còlon",Color:"Color","Color picker":"Selector de colors",Column:"Columna","Contains as member":"Conté com a membre","Content editing keystrokes":"Tecles edició de contingut","Copy selected content":"Copia el contingut seleccionat","Copyright sign":"Signe de drets d'autor","Create link":"Crea un enllaç","Cruzeiro sign":"signe del cruzeiro",Currency:"Moneda","Currency sign":"signe de divisa",Dashed:"De guions",Decimal:"Decimal","Decimal with leading zero":"Decimal amb un zero al davant","Decrease indent":"Reduir el sagnat","Decrease list item indent":"Redueix el sagnat de l'element de la llista",Default:"Predeterminada","Degree sign":"Signe del grau","Delete column":"Suprimir la columna","Delete row":"Suprimir fila","Dim grey":"Gris fosc",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Signe de divisió","Document colors":"Colors del document","Dollar sign":"signe del dòlar","Dong sign":"signe del dong",Dotted:"De punts",Double:"Doble","Double dagger":"Doble obelisc o diesi","Double exclamation mark":"Doble signe d'exclamació","Double low-9 quotation mark":"Cometes dobles inferiors","Double question mark":"Doble signe d'interrogació",Downloadable:"Es pot descarregar","downwards arrow to bar":"fletxa cap a la barra de sota","downwards dashed arrow":"fletxa discontínua cap avall","downwards double arrow":"fletxa doble cap avall","downwards simple arrow":"fletxa simple cap avall","Drachma sign":"signe del dracma","Drag to move":"Arrossega per moure","Dropdown toolbar":"Barra d'eines desplegable","Edit block":"Editar bloc","Edit link":"Editar enllaç","Edit source":"Editar la font","Editor block content toolbar":"Barra d'eines de contingut del bloc de l'editor","Editor contextual toolbar":"Barra d'eines contextual de l'editor","Editor dialog":"Diàleg de l'editor","Editor editing area: %0":"Àrea d'edició d'editor: %0","Editor toolbar":"Barra d'eines de l'editor","Element of":"Element de","Em dash":"Guió llarg","Empty set":"Conjunt buit","Empty snippet content":"Contingut del fragment buit","En dash":"Guió mitjà","end with leftwards arrow above":"end amb fletxa cap a l'esquerra per sobre","Enter image caption":"Introduir el peu de foto de la imatge","Enter table caption":"Introduir el peu de foto de la taula","Euro sign":"signe de l'euro","Euro-currency sign":"signe de l'eurodivisa","Exclamation question mark":"Signe d'interrogació d'exclamació","Execute the currently focused button":"Executa el botó seleccionat","Font Background Color":"Color de fons del tipus de lletra","Font Color":"Color del tipLine truncated
!function(a){const e=a.ca=a.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(pot requerir <kbd>Fn</kbd>))","%0 of %1":"%0 de %1",Accept:"Accepta",Accessibility:"Accessibilitat","Accessibility help":"Ajuda d'accessibilitat","Align cell text to the bottom":"Alinear el text de la cel·la a la part inferior","Align cell text to the center":"Alinear el text de la cel·la al centre","Align cell text to the left":"Alinear el text de la cel·la a l'esquerra","Align cell text to the middle":"Alinear el text de la cel·la al centre","Align cell text to the right":"Alinear el text de la cel·la a la dreta","Align cell text to the top":"Alinear el text de la cel·la a la part superior","Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta","Align table to the left":"Alinear la taula a l'esquerra","Align table to the right":"Alinear la taula a la dreta",Alignment:"Alineació",All:"Tot","Almost equal to":"Gairebé igual a",Angle:"Angle","Approximately equal to":"Aproximadament igual a",Aquamarine:"Aiguamarina",Arrows:"Fletxes","Asterisk operator":"Operador d'asterisc","Austral sign":"signe de l'austral","back with leftwards arrow above":"back amb fletxa cap a l'esquerra per sobre",Background:"Fons","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Sota hi trobareu un llistat de dreceres del teclat que podeu emprar amb aquest editor.",Big:"Gran","Bitcoin sign":"signe del bitcoin",Black:"Negre","Block quote":"Cita de bloc",Blue:"Blau","Blue marker":"Marcador blau",Bold:"Negreta","Bold text":"Text en negreta",Border:"Vora","Break text":"Parteix el text","Bulleted List":"Llista amb vinyetes","Bulleted list styles toolbar":"Barra d'eines d'estils de llista amb vinyetes",Cancel:"Cancel·lar","Caption for image: %0":"Peu de foto: %0","Caption for the image":"Peu de foto",Category:"Categoria","Cedi sign":"ok","Cell properties":"Propietats de la cel·la","Cent sign":"signe del cèntim","Center table":"Centrar la taula","Centered image":"Imatge centrada","Change image text alternative":"Canviar l'alternativa del text de la imatge","Choose heading":"Trieu l'encapçalament",Circle:"Cercle",Clear:"Esborra","Click to edit block":"Fes clic per editar el bloc",Close:"Tanca","Close contextual balloons, dropdowns, and dialogs":"Tanca finestres contextuals, desplegables i diàlegs",Code:"Codi","Code block":"Bloc de codis","Colon sign":"signe del còlon",Color:"Color","Color picker":"Selector de colors",Column:"Columna","Contains as member":"Conté com a membre","Content editing keystrokes":"Tecles edició de contingut","Copy selected content":"Copia el contingut seleccionat","Copyright sign":"Signe de drets d'autor","Create link":"Crea un enllaç","Cruzeiro sign":"signe del cruzeiro",Currency:"Moneda","Currency sign":"signe de divisa",Custom:"Personalitzat","Custom image size":"Mida de la imatge personalitzada",Dashed:"De guions",Decimal:"Decimal","Decimal with leading zero":"Decimal amb un zero al davant","Decrease indent":"Reduir el sagnat","Decrease list item indent":"Redueix el sagnat de l'element de la llista",Default:"Predeterminada","Degree sign":"Signe del grau","Delete column":"Suprimir la columna","Delete row":"Suprimir fila","Dim grey":"Gris fosc",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Signe de divisió","Document colors":"Colors del document","Dollar sign":"signe del dòlar","Dong sign":"signe del dong",Dotted:"De punts",Double:"Doble","Double dagger":"Doble obelisc o diesi","Double exclamation mark":"Doble signe d'exclamació","Double low-9 quotation mark":"Cometes dobles inferiors","Double question mark":"Doble signe d'interrogació",Downloadable:"Es pot descarregar","downwards arrow to bar":"fletxa cap a la barra de sota","downwards dashed arrow":"fletxa discontínua cap avall","downwards double arrow":"fletxa doble cap avall","downwards simple arrow":"fletxa simple cap avall","Drachma sign":"signe del dracma","Drag to move":"Arrossega per moure","Dropdown menu":"Menú desplegable","Dropdown toolbar":"Barra d'eines desplegable","Edit block":"Editar bloc","Edit link":"Editar enllaç","Edit source":"Editar la font","Editor block content toolbar":"Barra d'eines de contingut del bloc de l'editor","Editor contextual toolbar":"Barra d'eines contextual de l'editor","Editor dialog":"Diàleg de l'editor","Editor menu bar":"Barra de menú del editor","Editor toolbar":"Barra d'eines de l'editor","Element of":"Element de","Em dash":"Guió llarg","Empty set":"Conjunt buit","Empty snippet content":"Contingut del fragment buit","En dash":"Guió mitjà","end with leftwards arrow above":"end amb fletxa cap a l'esquerra per sobre","Enter image caption":"Introduir el peu de foto de la imatge","Enter table caption":"Introduir el peu de foto de la taula","Entering %0 code snippet":"S'està introduint %0 fragments de codi","Entering a to-do list":"Introduint una llista de tasques pendents","Entering code snippet":"InLine truncated
@@ -1 +1 @@
(function(e){const t=e["cs"]=e["cs"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(může vyžadovat <kbd>Fn</kbd>)","%0 of %1":"%0 z %1",Accept:"Přijmout","Accessibility help":"Podpora přístupnosti","Align cell text to the bottom":"Zarovnat text buňky dolů","Align cell text to the center":"Zarovnat text buňky na střed","Align cell text to the left":"Zarovnat text buňky doleva","Align cell text to the middle":"Zarovnat text buňky na střed","Align cell text to the right":"Zarovnat text buňky doprava","Align cell text to the top":"Zarovnat text buňky nahoru","Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo","Align table to the left":"Zarovnat tabulku doleva","Align table to the right":"Zarovnat tabulku doprava",Alignment:"Zarovnání",All:"Vše","Almost equal to":"Částečně rovný",Angle:"Úhel","Approximately equal to":"Aproximace",Aquamarine:"Akvamarínová",Arrows:"Šipky","Asterisk operator":"Hvězdička / násobení","Austral sign":"Znak Austral","back with leftwards arrow above":"šipka zpět",Background:"Pozadí","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Seznam klávesových zkratek, které lze v editoru použít, můžete nalézt níže.",Big:"Velké","Bitcoin sign":"Měna Bitcoin",Black:"Černá","Block quote":"Citace",Blue:"Modrá","Blue marker":"Modrý fix",Bold:"Tučné","Bold text":"Tučně",Border:"Okraj","Break text":"Obtékání textu","Bulleted List":"Odrážky","Bulleted list styles toolbar":"Panel seznamu s odrážkami",Cancel:"Zrušit","Caption for image: %0":"Popisek k obrázku: %0","Caption for the image":"Popisek k obrázku","Cedi sign":"Znak Cedi","Cell properties":"Vlastnosti buňky","Cent sign":"Znak cent","Center table":"Centrovat tabulku","Centered image":"Obrázek zarovnaný na střed","Change image text alternative":"Změnit alternativní text obrázku","Character categories":"Kategorie znaků","Choose heading":"Zvolte nadpis",Circle:"Kruh",Clear:"Smazat","Click to edit block":"Kliknutím upravíte blok",Close:"Zavřít","Close contextual balloons, dropdowns, and dialogs":"Zavřít kontextuální balóny, rozbalovací menu a dialogy",Code:"Kódový blok","Colon sign":"dvojtečka",Color:"Barva","Color picker":"Vybrat barvu",Column:"Sloupec","Contains as member":"Obsahuje prvek","Content editing keystrokes":"Klávesy na úpravu obsahu","Copy selected content":"Zkopírovat vybraný obsah","Copyright sign":"Copyright","Create link":"Vytvořit odkaz","Cruzeiro sign":"Měna Cruzeiro",Currency:"Měna","Currency sign":"Znak měny",Dashed:"Čárkovaná",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začátku","Decrease indent":"Zmenšit odsazení","Decrease list item indent":"Zmenšit odsazení položky seznamu",Default:"Výchozí","Degree sign":"Znak stupeň","Delete column":"Smazat sloupec","Delete row":"Smazat řádek","Dim grey":"Tmavě šedá",Dimensions:"Rozměry",Disc:"Plný kruh","Division sign":"Dělení","Document colors":"Barvy dokumentu","Dollar sign":"Znak Dolar","Dong sign":"Znak Dong",Dotted:"Tečkovaná",Double:"Dvojitá","Double dagger":"Dvojkříž","Double exclamation mark":"Dvojitý vykřičník","Double low-9 quotation mark":"Dvojitá spodní uvozovka","Double question mark":"Dvojitý otazník",Downloadable:"Ke stažení","downwards arrow to bar":"šipka dolů do svislé čáry","downwards dashed arrow":"přerušovaná šipka dolů","downwards double arrow":"dvojitá šipka dolů","downwards simple arrow":"jednoduchá šipka dolů","Drachma sign":"Znak Drachma","Drag to move":"Přesuňte potažením","Dropdown toolbar":"Rozbalovací panel nástrojů","Edit block":"Upravit blok","Edit link":"Upravit odkaz","Edit source":"Upravit zdroj","Editor block content toolbar":"Panel nástrojů obsahu bloku editoru","Editor contextual toolbar":"Kontextový panel nástrojů editoru","Editor dialog":"Dialog editoru","Editor editing area: %0":"Editační oblast editoru: %0","Editor toolbar":"Panel nástrojů editoru","Element of":"Patří / Je součástí","Em dash":"Dlouhá pomlčka","Empty set":"Prázdná množina","Empty snippet content":"Prázdný obsah kódu","En dash":"Pomlčka","end with leftwards arrow above":"šipka konec","Enter image caption":"Zadejte popis obrázku","Enter table caption":"Zadejte titulek tabulky","Euro sign":"Znak Euro","Euro-currency sign":"Mena Euro","Exclamation question mark":"Vykřičník a otazník","Execute the currently focused button":"Stisknout aktuálně zaměřené tlačítko","Font Background Color":"Barva pozadí písma","Font Color":"Barva písma","Font Family":"Typ písma","Font Size":"Velikost písma","For all":"Pro všechny prvky v množině","Fraction slash":"Lomítko / Dělení","French franc sign":"Měna Francouzský Frank","Full size image":"Obrázek v plné velikosti","German penny sign":"Německá penny","Greater-than or equal to":"Větší nebo roven","Greater-than sign":Line truncated
!function(e){const t=e.cs=e.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(může vyžadovat <kbd>Fn</kbd>)","%0 of %1":"%0 z %1",Accept:"Přijmout",Accessibility:"Přístupnost","Accessibility help":"Podpora přístupnosti","Align cell text to the bottom":"Zarovnat text buňky dolů","Align cell text to the center":"Zarovnat text buňky na střed","Align cell text to the left":"Zarovnat text buňky doleva","Align cell text to the middle":"Zarovnat text buňky na střed","Align cell text to the right":"Zarovnat text buňky doprava","Align cell text to the top":"Zarovnat text buňky nahoru","Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo","Align table to the left":"Zarovnat tabulku doleva","Align table to the right":"Zarovnat tabulku doprava",Alignment:"Zarovnání",All:"Vše","Almost equal to":"Částečně rovný",Angle:"Úhel","Approximately equal to":"Aproximace",Aquamarine:"Akvamarínová",Arrows:"Šipky","Asterisk operator":"Hvězdička / násobení","Austral sign":"Znak Austral","back with leftwards arrow above":"šipka zpět",Background:"Pozadí","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Seznam klávesových zkratek, které lze v editoru použít, můžete nalézt níže.",Big:"Velké","Bitcoin sign":"Měna Bitcoin",Black:"Černá","Block quote":"Citace",Blue:"Modrá","Blue marker":"Modrý fix",Bold:"Tučné","Bold text":"Tučně",Border:"Okraj","Break text":"Obtékání textu","Bulleted List":"Odrážky","Bulleted list styles toolbar":"Panel seznamu s odrážkami",Cancel:"Zrušit","Caption for image: %0":"Popisek k obrázku: %0","Caption for the image":"Popisek k obrázku",Category:"Kategorie","Cedi sign":"Znak Cedi","Cell properties":"Vlastnosti buňky","Cent sign":"Znak cent","Center table":"Centrovat tabulku","Centered image":"Obrázek zarovnaný na střed","Change image text alternative":"Změnit alternativní text obrázku","Choose heading":"Zvolte nadpis",Circle:"Kruh",Clear:"Smazat","Click to edit block":"Kliknutím upravíte blok",Close:"Zavřít","Close contextual balloons, dropdowns, and dialogs":"Zavřít kontextuální balóny, rozbalovací menu a dialogy",Code:"Kódový blok","Code block":"Blok kódu","Colon sign":"dvojtečka",Color:"Barva","Color picker":"Vybrat barvu",Column:"Sloupec","Contains as member":"Obsahuje prvek","Content editing keystrokes":"Klávesy na úpravu obsahu","Copy selected content":"Zkopírovat vybraný obsah","Copyright sign":"Copyright","Create link":"Vytvořit odkaz","Cruzeiro sign":"Měna Cruzeiro",Currency:"Měna","Currency sign":"Znak měny",Custom:"Vlastní","Custom image size":"Vlastní velikost obrázku",Dashed:"Čárkovaná",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začátku","Decrease indent":"Zmenšit odsazení","Decrease list item indent":"Zmenšit odsazení položky seznamu",Default:"Výchozí","Degree sign":"Znak stupeň","Delete column":"Smazat sloupec","Delete row":"Smazat řádek","Dim grey":"Tmavě šedá",Dimensions:"Rozměry",Disc:"Plný kruh","Division sign":"Dělení","Document colors":"Barvy dokumentu","Dollar sign":"Znak Dolar","Dong sign":"Znak Dong",Dotted:"Tečkovaná",Double:"Dvojitá","Double dagger":"Dvojkříž","Double exclamation mark":"Dvojitý vykřičník","Double low-9 quotation mark":"Dvojitá spodní uvozovka","Double question mark":"Dvojitý otazník",Downloadable:"Ke stažení","downwards arrow to bar":"šipka dolů do svislé čáry","downwards dashed arrow":"přerušovaná šipka dolů","downwards double arrow":"dvojitá šipka dolů","downwards simple arrow":"jednoduchá šipka dolů","Drachma sign":"Znak Drachma","Drag to move":"Přesuňte potažením","Dropdown menu":"Rozbalovací nabídka","Dropdown toolbar":"Rozbalovací panel nástrojů","Edit block":"Upravit blok","Edit link":"Upravit odkaz","Edit source":"Upravit zdroj","Editor block content toolbar":"Panel nástrojů obsahu bloku editoru","Editor contextual toolbar":"Kontextový panel nástrojů editoru","Editor dialog":"Dialog editoru","Editor menu bar":"Panel nabídek editoru","Editor toolbar":"Panel nástrojů editoru","Element of":"Patří / Je součástí","Em dash":"Dlouhá pomlčka","Empty set":"Prázdná množina","Empty snippet content":"Prázdný obsah kódu","En dash":"Pomlčka","end with leftwards arrow above":"šipka konec","Enter image caption":"Zadejte popis obrázku","Enter table caption":"Zadejte titulek tabulky","Entering %0 code snippet":"Zadávání fragmentu kódu %0","Entering a to-do list":"Zadání seznamu úkolů","Entering code snippet":"Zadávání fragmentu kódu","Error during image upload":"Při nahrávání obrázku došlo k chybě","Euro sign":"Znak Euro","Euro-currency sign":"Mena Euro","Exclamation question mark":"Vykřičník a otazník","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"SpusťtLine truncated
@@ -1 +1 @@
(function(e){const t=e["da"]=e["da"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(kan kræve <kbd>Fn</kbd>)","%0 of %1":"%0 af %1",Accept:"Accepter","Accessibility help":"Tilgængelighedshjælp","Align cell text to the bottom":"Justér tekstcelle til bunden","Align cell text to the center":"Justér tekstcelle centreret","Align cell text to the left":"Justér tekstcelle til venstre","Align cell text to the middle":"Justér tekstcelle til midten","Align cell text to the right":"Justér tekstcelle til højre","Align cell text to the top":"Justér tekstcelle til top","Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre","Align table to the left":"Justér tabel til venstre","Align table to the right":"Justér tabel til højre",Alignment:"Justering",All:"Alle","Almost equal to":"Næsten lig med",Angle:"Vinkel","Approximately equal to":"Nogenlunde lig med",Aquamarine:"Marineblå",Arrows:"Pile","Asterisk operator":"Asterisk-operator","Austral sign":"Austral-tegn","back with leftwards arrow above":"tilbage med venstrepegende pil over",Background:"Baggrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Nedenfor kan du finde en liste over tastaturgenveje, der kan bruges i editoren.",Big:"Stor","Bitcoin sign":"Bitcoin-tegn",Black:"Sort","Block quote":"Blot citat",Blue:"Blå","Blue marker":"Blå markør",Bold:"Fed","Bold text":"Fed tekst",Border:"Ramme","Break text":"Opdel tekst","Bulleted List":"Punktopstilling","Bulleted list styles toolbar":"Værktøjslinje til punktopdelt liste",Cancel:"Annullér","Caption for image: %0":"Billedtekst for billede: %0","Caption for the image":"Billedtekst for billedet","Cedi sign":"Cedi-tegn","Cell properties":"Celleegenskaber","Cent sign":"Cent-tegn","Center table":"Centrér tabel","Centered image":"Centreret billede","Change image text alternative":"Skift alternativ billedtekst","Character categories":"Tegnkategorier","Choose heading":"Vælg overskrift",Circle:"Cirkel",Clear:"Ryd","Click to edit block":"Klik for at redigere blok",Close:"Luk","Close contextual balloons, dropdowns, and dialogs":"Luk kontekstbetingede balloner, rullemenuer og dialoger",Code:"Kode","Colon sign":"Kolontegn",Color:"Farve","Color picker":"Farvevælger",Column:"Kolonne","Contains as member":"Element i","Content editing keystrokes":"Tastaturtryk til redigering af indhold","Copy selected content":"Kopier markeret indhold","Copyright sign":"Copyright-tegnb","Create link":"Opret link","Cruzeiro sign":"Cruzeiro-tegn",Currency:"Valuta","Currency sign":"Valuta-tegn",Dashed:"Stiplet (streg)",Decimal:"Decimal","Decimal with leading zero":"Decimal med nul i starten","Decrease indent":"Formindsk indrykning","Decrease list item indent":"Reducer listeemners indrykning",Default:"Standard","Degree sign":"Grad-tegn","Delete column":"Slet kolonne","Delete row":"Slet række","Dim grey":"Dunkel grå",Dimensions:"Dimensioner",Disc:"Disk","Division sign":"Divisionstegn","Document colors":"Dokumentfarve","Dollar sign":"Dollartegn","Dong sign":"Dong-tegn",Dotted:"Stiplet (prik)",Double:"Dobbel","Double dagger":"Dobbeltobelisk","Double exclamation mark":"Dobbelt udråbstegn","Double low-9 quotation mark":"Dobbelt lav-9 citationstegn","Double question mark":"Dobbelt spørgsmålstegn",Downloadable:"Kan downloades","downwards arrow to bar":"nedadpegende pil mod bjælke","downwards dashed arrow":"nedadpegende stiplet pil","downwards double arrow":"nedadpegende dobbeltpil","downwards simple arrow":"nedadgående simpel pil","Drachma sign":"Drakmer-tegn","Drag to move":"Træk for at flytte","Dropdown toolbar":"Dropdown værktøjslinje","Edit block":"Redigér blok","Edit link":"Redigér link","Edit source":"Rediger kilde","Editor block content toolbar":"Redigeringskasse indholdsværktøjslinje","Editor contextual toolbar":"Kontekstuel værktøjslinje til redigeringsprogram","Editor dialog":"Editor-dialog","Editor editing area: %0":"Redigeringsområde: %0","Editor toolbar":"Editor værktøjslinje","Element of":"Element af","Em dash":"Em-bindestreg","Empty set":"Tomt sæt","Empty snippet content":"Tøm uddragsindhold","En dash":"En-bindestreg","end with leftwards arrow above":"afslut med venstrepegende pil over","Enter image caption":"Indtast billedoverskrift","Enter table caption":"Indtast tabeltekst","Euro sign":"Eurotegn","Euro-currency sign":"Euro-valutategn","Exclamation question mark":"Udråbstegn-spørgsmålstegn","Execute the currently focused button":"Brug den knap, der i øjeblikket er i fokus","Font Background Color":"Skrift baggrundsfarve","Font Color":"Skriftfarve","Font Family":"Skriftfamilie","Font Size":"Skriftstørrelse","For all":"For alle","Fraction slash":"Brøk-tegn","French franc sign":"Franske franc-tegn","Full size image":"Fuld billedstørrelse","German penny sign":"Tysk penny-tegn","Greater-than or equal to":"Større end eller lig med-tegn","Greater-than sign":"Større end-tegn",Green:"Grøn","Green marLine truncated
!function(e){const t=e.da=e.da||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(kan kræve <kbd>Fn</kbd>)","%0 of %1":"%0 af %1",Accept:"Accepter",Accessibility:"Tilgængelighed","Accessibility help":"Tilgængelighedshjælp","Align cell text to the bottom":"Justér tekstcelle til bunden","Align cell text to the center":"Justér tekstcelle centreret","Align cell text to the left":"Justér tekstcelle til venstre","Align cell text to the middle":"Justér tekstcelle til midten","Align cell text to the right":"Justér tekstcelle til højre","Align cell text to the top":"Justér tekstcelle til top","Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre","Align table to the left":"Justér tabel til venstre","Align table to the right":"Justér tabel til højre",Alignment:"Justering",All:"Alle","Almost equal to":"Næsten lig med",Angle:"Vinkel","Approximately equal to":"Nogenlunde lig med",Aquamarine:"Marineblå",Arrows:"Pile","Asterisk operator":"Asterisk-operator","Austral sign":"Austral-tegn","back with leftwards arrow above":"tilbage med venstrepegende pil over",Background:"Baggrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Nedenfor kan du finde en liste over tastaturgenveje, der kan bruges i editoren.",Big:"Stor","Bitcoin sign":"Bitcoin-tegn",Black:"Sort","Block quote":"Blot citat",Blue:"Blå","Blue marker":"Blå markør",Bold:"Fed","Bold text":"Fed tekst",Border:"Ramme","Break text":"Opdel tekst","Bulleted List":"Punktopstilling","Bulleted list styles toolbar":"Værktøjslinje til punktopdelt liste",Cancel:"Annullér","Caption for image: %0":"Billedtekst for billede: %0","Caption for the image":"Billedtekst for billedet",Category:"Kategori","Cedi sign":"Cedi-tegn","Cell properties":"Celleegenskaber","Cent sign":"Cent-tegn","Center table":"Centrér tabel","Centered image":"Centreret billede","Change image text alternative":"Skift alternativ billedtekst","Choose heading":"Vælg overskrift",Circle:"Cirkel",Clear:"Ryd","Click to edit block":"Klik for at redigere blok",Close:"Luk","Close contextual balloons, dropdowns, and dialogs":"Luk kontekstbetingede balloner, rullemenuer og dialoger",Code:"Kode","Code block":"Kodeblok","Colon sign":"Kolontegn",Color:"Farve","Color picker":"Farvevælger",Column:"Kolonne","Contains as member":"Element i","Content editing keystrokes":"Tastaturtryk til redigering af indhold","Copy selected content":"Kopier markeret indhold","Copyright sign":"Copyright-tegnb","Create link":"Opret link","Cruzeiro sign":"Cruzeiro-tegn",Currency:"Valuta","Currency sign":"Valuta-tegn",Custom:"Brugerdefineret","Custom image size":"Brugerdefineret billedstørrelse",Dashed:"Stiplet (streg)",Decimal:"Decimal","Decimal with leading zero":"Decimal med nul i starten","Decrease indent":"Formindsk indrykning","Decrease list item indent":"Reducer listeemners indrykning",Default:"Standard","Degree sign":"Grad-tegn","Delete column":"Slet kolonne","Delete row":"Slet række","Dim grey":"Dunkel grå",Dimensions:"Dimensioner",Disc:"Disk","Division sign":"Divisionstegn","Document colors":"Dokumentfarve","Dollar sign":"Dollartegn","Dong sign":"Dong-tegn",Dotted:"Stiplet (prik)",Double:"Dobbel","Double dagger":"Dobbeltobelisk","Double exclamation mark":"Dobbelt udråbstegn","Double low-9 quotation mark":"Dobbelt lav-9 citationstegn","Double question mark":"Dobbelt spørgsmålstegn",Downloadable:"Kan downloades","downwards arrow to bar":"nedadpegende pil mod bjælke","downwards dashed arrow":"nedadpegende stiplet pil","downwards double arrow":"nedadpegende dobbeltpil","downwards simple arrow":"nedadgående simpel pil","Drachma sign":"Drakmer-tegn","Drag to move":"Træk for at flytte","Dropdown menu":"Rullemenu","Dropdown toolbar":"Dropdown værktøjslinje","Edit block":"Redigér blok","Edit link":"Redigér link","Edit source":"Rediger kilde","Editor block content toolbar":"Redigeringskasse indholdsværktøjslinje","Editor contextual toolbar":"Kontekstuel værktøjslinje til redigeringsprogram","Editor dialog":"Editor-dialog","Editor menu bar":"Editor menulinje","Editor toolbar":"Editor værktøjslinje","Element of":"Element af","Em dash":"Em-bindestreg","Empty set":"Tomt sæt","Empty snippet content":"Tøm uddragsindhold","En dash":"En-bindestreg","end with leftwards arrow above":"afslut med venstrepegende pil over","Enter image caption":"Indtast billedoverskrift","Enter table caption":"Indtast tabeltekst","Entering %0 code snippet":"Indtastning af %0 kodestykke","Entering a to-do list":"Indtastning af en huskeliste","Entering code snippet":"Indtastning af kodestykke","Error during image upload":"Fejl under upload af billede","Euro sign":"Eurotegn","Euro-currency sign":"Euro-valutategn","Exclamation question mark":"Udråbstegn-spørgsmålstegn","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"Udfør den aktuelt fokuserede knapLine truncated
@@ -1 +1 @@
(function(e){const t=e["de-ch"]=e["de-ch"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"","Align table to the right":"",Alignment:"",Aquamarine:"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Gross",Black:"","Block quote":"Blockzitat",Blue:"","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"",Border:"","Break text":"","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"","Caption for the image":"","Cell properties":"","Center table":"","Centered image":"zentriertes Bild","Change image text alternative":"Alternativtext ändern","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code",Color:"","Color picker":"",Column:"Spalte","Content editing keystrokes":"","Create link":"",Dashed:"",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"",Default:"Standard","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"",Dimensions:"",Disc:"Gefüllter Kreis","Document colors":"Farben des Dokuments",Dotted:"",Double:"",Downloadable:"Herunterladbar","Drag to move":"","Dropdown toolbar":"","Edit block":"","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"","Empty snippet content":"Codeschnipsel ohne Inhalt","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"","Execute the currently focused button":"","Font Background Color":"Hintergrundfarbe der Schrift","Font Color":"Schriftfarbe","Font Family":"Schriftfamilie","Font Size":"Schriftgrösse","Full size image":"Bild in voller Grösse",Green:"","Green marker":"Grüner Marker","Green pen":"Grüne Schriftfarbe",Grey:"",Groove:"","Header column":"Kopfspalte","Header row":"Kopfspalte",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Texthervorhebung","Horizontal text alignment toolbar":"","HTML snippet":"HTML-Codeschnipsel",Huge:"Riesig","Image resize list":"Bildgrössen-Liste","Image toolbar":"Bild Werkzeugleiste","image widget":"Bild-Steuerelement","In line":"","Increase indent":"Einzug vergrössern","Increase list item indent":"",Insert:"Einfügen","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert code block":"Code-Block einfügen","Insert column left":"","Insert column right":"","Insert HTML":"HTML einfügen","Insert image":"Bild einfügen","Insert image via URL":"Bild von URL einfügen","Insert media":"Medium einfügen","Insert paragraph after block":"Absatz nach Block einfügen","Insert paragraph before block":"Absatz vor Block einfügen","Insert row above":"Zeile oben einfügen","Insert row below":"Zeile unten einfügen","Insert table":"Tabelle einfügen",Inset:"","Invalid start index value.":"",Italic:"Kursiv","Italic text":"",Justify:"Blocksatz","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Left aligned image":"linksbündiges Bild","Light blue":"","Light green":"","Light grey":"",Link:"Link","Link image":"Bild verlinken","Link URL":"Link Adresse","List properties":"","Lower-latin":"Kleingeschriebene lateinische Buchstaben","Lower–roman":"Kleingeschriebene römische Zahlen","Media toolbar":"Medien Werkzeugleiste","Media URL":"Medien-URL","media widget":"Medien-Widget","Merge cell down":"Zelle unten verbinden","Merge cell left":"Zelle links verbinden","Merge cell right":"Zele rechts verbinden","Merge cell up":"Zelle oben verbinden","Merge cells":"Zellen verbinden","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Move the caret to allow typing directly after a widget":"","Move the caret to allow typing directly before Line truncated
!function(e){const t=e["de-ch"]=e["de-ch"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Gross","Bitcoin sign":"",Black:"","Block quote":"Blockzitat",Blue:"","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"",Border:"","Break text":"","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"zentriertes Bild","Change image text alternative":"Alternativtext ändern","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"Spalte","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"",Default:"Standard","Degree sign":"","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"",Dimensions:"",Disc:"Gefüllter Kreis","Division sign":"","Document colors":"Farben des Dokuments","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"Herunterladbar","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"Codeschnipsel ohne Inhalt","En dash":"","end with leftwards arrow above":"","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Hintergrundfarbe der Schrift","Font Color":"Schriftfarbe","Font Family":"Schriftfamilie","Font Size":"Schriftgrösse","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Bild in voller Grösse","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"Grüner Marker","Green pen":"Grüne Schriftfarbe",Grey:"",Groove:"","Guarani sign":"","Header column":"Kopfspalte","Header row":"Kopfspalte",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Texthervorhebung","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"HTML-Codeschnipsel",Huge:"Riesig","Identical to":"",Image:"","Image from computer":"","Image resize list":"Bildgrössen-Liste","Image toolbar":"Bild Werkzeugleiste","Image upload complete":"","Image via URL":"","image widget":"Bild-Steuerelement","In line":"","Increase indent":"Einzug vergrössern","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"Code-Block einfügen","Insert column left":"","Insert column right":"","Insert HTML":"HTML einfügen","Insert image":"Bild einfügen","InLine truncated
@@ -1 +1 @@
(function(e){const t=e["de"]=e["de"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(erfordert gegebenenfalls <kbd>Fn</kbd>)","%0 of %1":"%0 von %1",Accept:"Akzeptieren","Accessibility help":"Hilfe zur Eingabe","Align cell text to the bottom":"Zellentext unten ausrichten","Align cell text to the center":"Zellentext zentriert ausrichten","Align cell text to the left":"Zellentext linksbündig ausrichten","Align cell text to the middle":"Zellentext mittig ausrichten","Align cell text to the right":"Zellentext rechtsbündig ausrichten","Align cell text to the top":"Zellentext oben ausrichten","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"Tabelle links ausrichten","Align table to the right":"Tabelle rechts ausrichten",Alignment:"Ausrichtung",All:"Alle","Almost equal to":"Gerundet",Angle:"Winkel-Zeichen","Approximately equal to":"Ungefähr gleich",Aquamarine:"Aquamarinblau",Arrows:"Pfeile","Asterisk operator":"Hodge-Stern-Operator","Austral sign":"Austral-Zeichen","back with leftwards arrow above":"„Back“ darüber Pfeil nach links",Background:"Hintergrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Unten finden Sie eine Liste mit Tastenkombinationen, die im Editor benutzt werden können.",Big:"Groß","Bitcoin sign":"Bitcoin-Zeichen",Black:"Schwarz","Block quote":"Blockzitat",Blue:"Blau","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"Fettschrift",Border:"Rahmen","Break text":"Bild teilt Text","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"Bildunterschrift: %0","Caption for the image":"Bildunterschrift","Cedi sign":"Cedi-Zeichen","Cell properties":"Zelleneigenschaften","Cent sign":"Cent-Zeichen","Center table":"Tabelle zentrieren","Centered image":"Zentriertes Bild","Change image text alternative":"Alternativtext ändern","Character categories":"Zeichenkategorien","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"Löschen","Click to edit block":"Zum Bearbeiten des Blocks klicken",Close:"Schließen","Close contextual balloons, dropdowns, and dialogs":"Kontextsprechblasen, Dropdown-Menü und Dialoge schließen",Code:"Code","Colon sign":"Colón-Zeichen",Color:"Farbe","Color picker":"Farbwähler",Column:"Spalte","Contains as member":"Enthält als Element","Content editing keystrokes":"Tastatureingaben zur Inhaltsverarbeitung","Copy selected content":"Markierten Inhalt kopieren","Copyright sign":"Copyright-Zeichen","Create link":"Link erstellen","Cruzeiro sign":"Cruzeiro-Zeichen",Currency:"Währung","Currency sign":"Währungssymbol",Dashed:"Gestrichelt",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"Listeneinzug verkleinern",Default:"Standard","Degree sign":"Grad-Zeichen","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"Dunkelgrau",Dimensions:"Größe",Disc:"Gefüllter Kreis","Division sign":"Geteilt-Zeichen","Document colors":"Dokumentfarben","Dollar sign":"Dollar-Zeichen","Dong sign":"Đồng-Zeichen",Dotted:"Gepunktet",Double:"Doppelt","Double dagger":"Zweibalkenkreuz","Double exclamation mark":"Doppeltes Ausrufezeichen","Double low-9 quotation mark":"Doppelte Anführungszeichen links unten","Double question mark":"Doppeltes Fragezeichen",Downloadable:"Herunterladbar","downwards arrow to bar":"Pfeil nach unten zum Querstrich","downwards dashed arrow":"Gestrichelter Pfeil nach unten","downwards double arrow":"Doppelpfeil nach unten","downwards simple arrow":"einfacher Abwärtspfeil","Drachma sign":"Drachme-Zeichen","Drag to move":"Zum Verschieben ziehen","Dropdown toolbar":"Dropdown-Liste Werkzeugleiste","Edit block":"Absatz bearbeiten","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"Editor Blockinhalt-Toolbar","Editor contextual toolbar":"Editor kontextuelle Toolbar","Editor dialog":"Editor-Dialog","Editor editing area: %0":"Bearbeitungsbereich des Editors: %0","Editor toolbar":"Editor Werkzeugleiste","Element of":"Element von","Em dash":"Geviertstrich","Empty set":"Leere Menge","Empty snippet content":"Leerer Snippet-Inhalt","En dash":"Halbgeviertstrich","end with leftwards arrow above":"„End“ darüber Pfeil nach links","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"Tabellenüberschrift eingeben","Euro sign":"Euro-Zeichen","Euro-currency sign":"Euro-Währungszeichen","Exclamation question mark":"Ruf-Frage-Zeichen","Execute the currently focused button":"Das gegenwärtig im Fokus stehende Tastenfeld betätigen","Font Background Color":"Hintergrundfarbe","Font Color":"Schriftfarbe","Font Family":"Schriftart","Font Size":"Schriftgröße","For all":"Allquantor","Fraction slash":"Schrägstrich","French franc sign":"Französischer FraLine truncated
!function(e){const t=e.de=e.de||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(erfordert gegebenenfalls <kbd>Fn</kbd>)","%0 of %1":"%0 von %1",Accept:"Akzeptieren",Accessibility:"Bedienungshilfen","Accessibility help":"Hilfe zur Eingabe","Align cell text to the bottom":"Zellentext unten ausrichten","Align cell text to the center":"Zellentext zentriert ausrichten","Align cell text to the left":"Zellentext linksbündig ausrichten","Align cell text to the middle":"Zellentext mittig ausrichten","Align cell text to the right":"Zellentext rechtsbündig ausrichten","Align cell text to the top":"Zellentext oben ausrichten","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"Tabelle links ausrichten","Align table to the right":"Tabelle rechts ausrichten",Alignment:"Ausrichtung",All:"Alle","Almost equal to":"Gerundet",Angle:"Winkel-Zeichen","Approximately equal to":"Ungefähr gleich",Aquamarine:"Aquamarinblau",Arrows:"Pfeile","Asterisk operator":"Hodge-Stern-Operator","Austral sign":"Austral-Zeichen","back with leftwards arrow above":"„Back“ darüber Pfeil nach links",Background:"Hintergrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Unten finden Sie eine Liste mit Tastenkombinationen, die im Editor benutzt werden können.",Big:"Groß","Bitcoin sign":"Bitcoin-Zeichen",Black:"Schwarz","Block quote":"Blockzitat",Blue:"Blau","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"Fettschrift",Border:"Rahmen","Break text":"Bild teilt Text","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"Bildunterschrift: %0","Caption for the image":"Bildunterschrift",Category:"Kategorie","Cedi sign":"Cedi-Zeichen","Cell properties":"Zelleneigenschaften","Cent sign":"Cent-Zeichen","Center table":"Tabelle zentrieren","Centered image":"Zentriertes Bild","Change image text alternative":"Alternativtext ändern","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"Löschen","Click to edit block":"Zum Bearbeiten des Blocks klicken",Close:"Schließen","Close contextual balloons, dropdowns, and dialogs":"Kontextsprechblasen, Dropdown-Menü und Dialoge schließen",Code:"Code","Code block":"Codeblock","Colon sign":"Colón-Zeichen",Color:"Farbe","Color picker":"Farbwähler",Column:"Spalte","Contains as member":"Enthält als Element","Content editing keystrokes":"Tastatureingaben zur Inhaltsverarbeitung","Copy selected content":"Markierten Inhalt kopieren","Copyright sign":"Copyright-Zeichen","Create link":"Link erstellen","Cruzeiro sign":"Cruzeiro-Zeichen",Currency:"Währung","Currency sign":"Währungssymbol",Custom:"Benutzerdefiniert","Custom image size":"Benutzerdefinierte Bildgröße",Dashed:"Gestrichelt",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"Listeneinzug verkleinern",Default:"Standard","Degree sign":"Grad-Zeichen","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"Dunkelgrau",Dimensions:"Größe",Disc:"Gefüllter Kreis","Division sign":"Geteilt-Zeichen","Document colors":"Dokumentfarben","Dollar sign":"Dollar-Zeichen","Dong sign":"Đồng-Zeichen",Dotted:"Gepunktet",Double:"Doppelt","Double dagger":"Zweibalkenkreuz","Double exclamation mark":"Doppeltes Ausrufezeichen","Double low-9 quotation mark":"Doppelte Anführungszeichen links unten","Double question mark":"Doppeltes Fragezeichen",Downloadable:"Herunterladbar","downwards arrow to bar":"Pfeil nach unten zum Querstrich","downwards dashed arrow":"Gestrichelter Pfeil nach unten","downwards double arrow":"Doppelpfeil nach unten","downwards simple arrow":"einfacher Abwärtspfeil","Drachma sign":"Drachme-Zeichen","Drag to move":"Zum Verschieben ziehen","Dropdown menu":"Dropdown-Menü","Dropdown toolbar":"Dropdown-Liste Werkzeugleiste","Edit block":"Absatz bearbeiten","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"Editor Blockinhalt-Toolbar","Editor contextual toolbar":"Editor kontextuelle Toolbar","Editor dialog":"Editor-Dialog","Editor menu bar":"Menüleiste des Editors","Editor toolbar":"Editor Werkzeugleiste","Element of":"Element von","Em dash":"Geviertstrich","Empty set":"Leere Menge","Empty snippet content":"Leerer Snippet-Inhalt","En dash":"Halbgeviertstrich","end with leftwards arrow above":"„End“ darüber Pfeil nach links","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"Tabellenüberschrift eingeben","Entering %0 code snippet":"%0 Code-Ausschnitt eingeben","Entering a to-do list":"Eingabe einer Aufgabenliste","Entering code snippet":"Code-Ausschnit eingeben","Error during image upload":"Fehler beim Hochladen des Bildes","Euro sign":"Euro-Zeichen","Euro-currency sign":"Euro-Währungszeichen","Exclamation questionLine truncated
@@ -1 +1 @@
(function(t){const e=t["el"]=t["el"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(μπορεί να απαιτείται το <kbd> Fn</kbd>)","%0 of %1":"%0 από %1",Accept:"Αποδοχή","Accessibility help":"Βοήθεια προσβασιμότητας","Align cell text to the bottom":"Στοίχιση κειμένου κελιού κάτω","Align cell text to the center":"Στοίχιση κειμένου κελιού στο κέντρο","Align cell text to the left":"Στοίχιση κειμένου κελιού στα αριστερά","Align cell text to the middle":"Στοίχιση κειμένου κελιού στο μέσο","Align cell text to the right":"Στοίχιση κειμένου κελιού στα δεξιά","Align cell text to the top":"Στοίχιση κειμένου κελιού επάνω","Align center":"Στοίχιση στο κέντρο","Align left":"Στοίχιση αριστερά","Align right":"Στοίχιση δεξιά","Align table to the left":"Στοίχιση πίνακα στα αριστερά","Align table to the right":"Στοίχιση πίνακα στα δεξιά",Alignment:"Στοίχιση",All:"Όλα","Almost equal to":"Περίπου ίσο με",Angle:"Γωνία","Approximately equal to":"Κατά προσέγγιση ίσο με",Aquamarine:"Ακουαμαρίνα",Arrows:"Βέλη","Asterisk operator":"Τελεστής αστερίσκος","Austral sign":"Σύμβολο αουστράλ Αργεντινής","back with leftwards arrow above":"όπισθεν με αριστερό βέλος άνω",Background:"Υπόβαθρο","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Παρακάτω, μπορείτε να βρείτε μια λίστα με συντομεύσεις πληκτρολογίου που μπορείτε να χρησιμοποιήσετε στο εργαλείο επεξεργασίας.",Big:"Μεγάλο","Bitcoin sign":"Σύμβολο Bitcoin",Black:"Μαύρο","Block quote":"Περιοχή παράθεσης",Blue:"Μπλε","Blue marker":"Επισημαντής μπλε",Bold:"Έντονα","Bold text":"Έντονο κείμενο",Border:"Περίγραμμα","Break text":"Κατάτμηση κειμένου","Bulleted List":"Λίστα με κουκκίδες","Bulleted list styles toolbar":"Γραμμή εργαλείων στυλ λιστών με κουκίδες",Cancel:"Ακύρωση","Caption for image: %0":"Λεζάντα για την εικόνα: %0","Caption for the image":"Λεζάντα για την εικόνα","Cedi sign":"Σύμβολο σίντι Γκάνας","Cell properties":"Ιδιότητες κελιού","Cent sign":"Σύμβολο λεπτού","Center table":"Στοίχιση πίνακα στο κέντρο","Centered image":"Εικόνα με στοίχιση στο κέντρο","Change image text alternative":"Αλλαγή εναλλακτικού κείμενου εικόνας","Character categories":"Κατηγορίες χαρακτήρων","Choose heading":"Επιλέξτε κεφαλίδα",Circle:"Κύκλος",Clear:"Καθαρισμός","Click to edit block":"Κάντε κλικ για να επεξεργαστείτε το μπλοκ",Close:"Κλείσιμο","Close contextual balloons, dropdowns, and dialogs":"Κλείσιμο παραθύρων σχολίων, αναπτυσσόμενων μενού και παραθύρων διαλόγου",Code:"Κώδικας","Colon sign":"Σύμβολο άνω κάτω τελείας",Color:"Χρώμα","Color picker":"Επιλογέας χρώματος",Column:"Στήλη","Contains as member":"Περιέχει ως μέλος","Content editing keystrokes":"Πλήκτρα επεξεργασίας περιεχομένου","Copy selected content":"Αντιγραφή επιλεγμένου περιεχομένου","Copyright sign":"Σύμβολο πνευματικής ιδιοκτησίας","Create link":"Δημιουργία συνδέσμου","Cruzeiro sign":"Σύμβολο Κρουζέιρο",Currency:"Νόμισμα","Currency sign":"Σύμβολο νομίσματος",Dashed:"Με παύλες",Decimal:"Δεκαδικό","Decimal with leading zero":"Δεκαδικό με μηδενικά","Decrease indent":"Μείωση εσοχής","Decrease list item indent":"Μείωση εσοχής στοιχείου λίστας",Default:"Προεπιλογή","Degree sign":"Σύμβολο βαθμών Κελσίου","Delete column":"Διαγραφή στήλης","Delete row":"Διαγραφή γραμμής","Dim grey":"Θολό γκρι",Dimensions:"Διαστάσεις",Disc:"Δίσκος","Division sign":"Σύμβολο διαίρεσης","Document colors":"Χρώματα εγγράφου","Dollar sign":"Σύμβολο δολλαρίου","Dong sign":"Σύμβολο Ντόνγκ Βιετνάμ",Dotted:"Διάστικτο",Double:"Διπλό"Line truncated
!function(t){const e=t.el=t.el||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(μπορεί να απαιτείται το <kbd> Fn</kbd>)","%0 of %1":"%0 από %1",Accept:"Αποδοχή",Accessibility:"Προσβασιμότητα","Accessibility help":"Βοήθεια προσβασιμότητας","Align cell text to the bottom":"Στοίχιση κειμένου κελιού κάτω","Align cell text to the center":"Στοίχιση κειμένου κελιού στο κέντρο","Align cell text to the left":"Στοίχιση κειμένου κελιού στα αριστερά","Align cell text to the middle":"Στοίχιση κειμένου κελιού στο μέσο","Align cell text to the right":"Στοίχιση κειμένου κελιού στα δεξιά","Align cell text to the top":"Στοίχιση κειμένου κελιού επάνω","Align center":"Στοίχιση στο κέντρο","Align left":"Στοίχιση αριστερά","Align right":"Στοίχιση δεξιά","Align table to the left":"Στοίχιση πίνακα στα αριστερά","Align table to the right":"Στοίχιση πίνακα στα δεξιά",Alignment:"Στοίχιση",All:"Όλα","Almost equal to":"Περίπου ίσο με",Angle:"Γωνία","Approximately equal to":"Κατά προσέγγιση ίσο με",Aquamarine:"Ακουαμαρίνα",Arrows:"Βέλη","Asterisk operator":"Τελεστής αστερίσκος","Austral sign":"Σύμβολο αουστράλ Αργεντινής","back with leftwards arrow above":"όπισθεν με αριστερό βέλος άνω",Background:"Υπόβαθρο","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Παρακάτω, μπορείτε να βρείτε μια λίστα με συντομεύσεις πληκτρολογίου που μπορείτε να χρησιμοποιήσετε στο εργαλείο επεξεργασίας.",Big:"Μεγάλο","Bitcoin sign":"Σύμβολο Bitcoin",Black:"Μαύρο","Block quote":"Περιοχή παράθεσης",Blue:"Μπλε","Blue marker":"Επισημαντής μπλε",Bold:"Έντονα","Bold text":"Έντονο κείμενο",Border:"Περίγραμμα","Break text":"Κατάτμηση κειμένου","Bulleted List":"Λίστα με κουκκίδες","Bulleted list styles toolbar":"Γραμμή εργαλείων στυλ λιστών με κουκίδες",Cancel:"Ακύρωση","Caption for image: %0":"Λεζάντα για την εικόνα: %0","Caption for the image":"Λεζάντα για την εικόνα",Category:"Κατηγορία","Cedi sign":"Σύμβολο σίντι Γκάνας","Cell properties":"Ιδιότητες κελιού","Cent sign":"Σύμβολο λεπτού","Center table":"Στοίχιση πίνακα στο κέντρο","Centered image":"Εικόνα με στοίχιση στο κέντρο","Change image text alternative":"Αλλαγή εναλλακτικού κείμενου εικόνας","Choose heading":"Επιλέξτε κεφαλίδα",Circle:"Κύκλος",Clear:"Καθαρισμός","Click to edit block":"Κάντε κλικ για να επεξεργαστείτε το μπλοκ",Close:"Κλείσιμο","Close contextual balloons, dropdowns, and dialogs":"Κλείσιμο παραθύρων σχολίων, αναπτυσσόμενων μενού και παραθύρων διαλόγου",Code:"Κώδικας","Code block":"Μπλοκ κώδικα","Colon sign":"Σύμβολο άνω κάτω τελείας",Color:"Χρώμα","Color picker":"Επιλογέας χρώματος",Column:"Στήλη","Contains as member":"Περιέχει ως μέλος","Content editing keystrokes":"Πλήκτρα επεξεργασίας περιεχομένου","Copy selected content":"Αντιγραφή επιλεγμένου περιεχομένου","Copyright sign":"Σύμβολο πνευματικής ιδιοκτησίας","Create link":"Δημιουργία συνδέσμου","Cruzeiro sign":"Σύμβολο Κρουζέιρο",Currency:"Νόμισμα","Currency sign":"Σύμβολο νομίσματος",Custom:"Προσαρμοσμένο","Custom image size":"Προσαρμοσμένο μέγεθος εικόνας",Dashed:"Με παύλες",Decimal:"Δεκαδικό","Decimal with leading zero":"Δεκαδικό με μηδενικά","Decrease indent":"Μείωση εσοχής","Decrease list item indent":"Μείωση εσοχής στοιχείου λίστας",Default:"Προεπιλογή","Degree sign":"Σύμβολο βαθμών Κελσίου","Delete column":"Διαγραφή στήλης","Delete row":"Διαγραφή γραμμής","Dim grey":"Θολό γκρι",Dimensions:"Διαστάσεις",Disc:"Δίσκος","Division sign":"Σύμβολο διαίρεσης","Document colors":"Χρώματα εγγράφουLine truncated
@@ -1 +1 @@
(function(t){const e=t["en-au"]=t["en-au"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 of %1",Accept:"","Accessibility help":"","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align centre","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Centre table","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Character categories":"Character categories","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code","Colon sign":"Colon sign",Color:"Colour","Color picker":"Colour picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"","Copyright sign":"Copyright sign","Create link":"","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colours","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"","Editor editing area: %0":"Editor editing area: %0","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button":"","Font Background Color":"Font Background Colour","Font Color":"Font Colour","Font Family":"Font Family","Font Size":"Font Size","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","Full size image":"Full size image","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"Groove","Guarani sign":"Guarani sign","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Height:"Height","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Highlight","Horizontal ellipsis":"Horizontal ellipsis","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Hryvnia sign":"Hryvnia sign","HTML Line truncated
!function(t){const e=t["en-au"]=t["en-au"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 of %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align centre","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image",Category:"","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Centre table","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code","Code block":"","Colon sign":"Colon sign",Color:"Colour","Color picker":"Colour picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"Copyright sign","Create link":"","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Custom:"","Custom image size":"",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colours","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"","Editor menu bar":"","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Font Background Colour","Font Color":"Font Colour","Font Family":"Font Family","Font Size":"Font Size","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","From computer":"","Full size image":"Full size image","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"Groove","Guarani sign":"Guarani sign","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5Line truncated
@@ -1 +1 @@
(function(e){const t=e["en-gb"]=e["en-gb"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 of %1",Accept:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"","Align table to the right":"",Alignment:"",Aquamarine:"Aquamarine",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Big",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"",Border:"","Break text":"","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"",Cancel:"Cancel","Caption for image: %0":"","Caption for the image":"","Cell properties":"","Center table":"","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code",Color:"","Color picker":"",Column:"Column","Content editing keystrokes":"","Create link":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"Decrease indent","Decrease list item indent":"",Default:"Default","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"",Disc:"","Document colors":"Document colours",Dotted:"",Double:"",Downloadable:"Downloadable","Drag to move":"","Dropdown toolbar":"","Edit block":"Edit block","Edit link":"Edit link","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"","Enter image caption":"Enter image caption","Enter table caption":"","Execute the currently focused button":"","Font Background Color":"Font Background Colour","Font Color":"Font Colour","Font Family":"Font Family","Font Size":"Font Size","Full size image":"Full size image",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Highlight","Horizontal text alignment toolbar":"",Huge:"Huge","Image resize list":"","Image toolbar":"","image widget":"Image widget","In line":"","Increase indent":"Increase indent","Increase list item indent":"",Insert:"","Insert a new table row (when in the last cell of a table)":"","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert image":"Insert image","Insert image via URL":"","Insert media":"Insert media","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table",Inset:"","Invalid start index value.":"",Italic:"Italic","Italic text":"",Justify:"Justify","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Left aligned image":"Left aligned image","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Link:"Link","Link image":"","Link URL":"Link URL","List properties":"","Lower-latin":"","Lower–roman":"","Media toolbar":"","Media URL":"Media URL","media widget":"Media widget","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Move the selection to the next cell":"","Move the selection to the previous cell":"","Navigate through the table":"","Navigate through the toolbar":"",Next:"Next","No results found":"","No searchable items":"",None:"","Numbered List":"Numbered List","Numbered list styles toolbar":"","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","Open media in new tab":"","Open the accessibility help dialog":"",Orange:"Orange",Original:"",Outset:"",Padding:"",Paragraph:"Paragraph","Paste the media URL in the input.":"Paste the media URL in the input.","Pink marker":"Pink marker","Press %0 for help.":"",Previous:"Previous",Purple:"Purple",Red:"Red","Red pen":"Red pen",Redo:"Redo","Remove color":"Remove colour","Remove Format":"Remove Format","Remove highlight":"Remove highlight","Replace from computer":"","Replace image":"","Replace image from computer":"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Restore Line truncated
!function(e){const t=e["en-gb"]=e["en-gb"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 of %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"Aquamarine",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Big","Bitcoin sign":"",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"",Border:"","Break text":"","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"",Cancel:"Cancel","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"Column","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"Decrease indent","Decrease list item indent":"",Default:"Default","Degree sign":"","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"",Disc:"","Division sign":"","Document colors":"Document colours","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"Downloadable","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"Edit block","Edit link":"Edit link","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"Enter image caption","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Font Background Colour","Font Color":"Font Colour","Font Family":"Font Family","Font Size":"Font Size","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Full size image","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"","Guarani sign":"","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Highlight","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"Huge","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"Image widget","In line":"","Increase indent":"Increase indent","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert HTML":"","Insert image":"Insert image","Insert image via URL":"","Insert media":"Insert media","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Line truncated
@@ -1 +1 @@
(function(e){const t=e["eo"]=e["eo"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"","Accessibility help":"",Aquamarine:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Black:"",Blue:"",Bold:"grasa","Bold text":"","Break text":"","Bulleted List":"Bula Listo","Bulleted list styles toolbar":"",Cancel:"Nuligi","Caption for image: %0":"","Caption for the image":"","Centered image":"","Change image text alternative":"Ŝanĝu la alternativan tekston de la bildo","Choose heading":"Elektu ĉapon",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Content editing keystrokes":"","Create link":"",Decimal:"","Decimal with leading zero":"","Decrease list item indent":"","Dim grey":"",Disc:"",Downloadable:"","Drag to move":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"","Enter image caption":"Skribu klarigon pri la bildo","Execute the currently focused button":"","Full size image":"Bildo kun reala dimensio",Green:"",Grey:"",Heading:"Ĉapo","Heading 1":"Ĉapo 1","Heading 2":"Ĉapo 2","Heading 3":"Ĉapo 3","Heading 4":"","Heading 5":"","Heading 6":"","Help Contents. To close this dialog press ESC.":"",HEX:"","Image resize list":"","Image toolbar":"","image widget":"bilda fenestraĵo","In line":"","Increase list item indent":"",Insert:"","Insert image":"Enmetu bildon","Insert image via URL":"","Invalid start index value.":"",Italic:"kursiva","Italic text":"","Keystrokes that can be used in a list":"","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"Ligilo","Link image":"","Link URL":"URL de la ligilo","List properties":"","Lower-latin":"","Lower–roman":"","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Navigate through the toolbar":"",Next:"","No results found":"","No searchable items":"","Numbered List":"Numerita Listo","Numbered list styles toolbar":"","Open in a new tab":"","Open link in new tab":"","Open the accessibility help dialog":"",Orange:"",Original:"",Paragraph:"Paragrafo","Press %0 for help.":"",Previous:"",Purple:"",Red:"",Redo:"Refari","Remove color":"","Replace from computer":"","Replace image":"","Replace image from computer":"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Restore default":"","Reversed order":"","Rich Text Editor":"Redaktilo de Riĉa Teksto","Right aligned image":"",Save:"Konservi","Show more items":"","Side image":"Flanka biildo",Square:"","Start at":"","Start index must be greater than 0.":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"","Text alternative":"Alternativa teksto","These keyboard shortcuts allow for quick access to content editing features.":"","This link has no URL":"","To-do List":"","Toggle caption off":"","Toggle caption on":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"",Turquoise:"","Type or paste your content here.":"","Type your title":"",Underline:"","Underline text":"",Undo:"Malfari",Unlink:"Malligi",Update:"","Update image URL":"","Upload failed":"","Upload from computer":"","Upload image from computer":"","Upper-latin":"","Upper-roman":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":"",White:"","Wrap text":"",Yellow:""});t.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
!function(t){const e=t.eo=t.eo||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"","Align left":"","Align right":"","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"",Blue:"","Blue marker":"",Bold:"grasa","Bold text":"",Border:"","Break text":"","Bulleted List":"Bula Listo","Bulleted list styles toolbar":"",Cancel:"Nuligi","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"Ŝanĝu la alternativan tekston de la bildo","Choose heading":"Elektu ĉapon",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"Skribu klarigon pri la bildo","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"","Font Color":"","Font Family":"","Font Size":"","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Bildo kun reala dimensio","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"Ĉapo","Heading 1":"Ĉapo 1","Heading 2":"Ĉapo 2","Heading 3":"Ĉapo 3","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"bilda fenestraĵo","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"Enmetu bildon","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"kursiva","Italic text":"",Justify:"","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Kip sign":"",Latin:"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","LLine truncated
@@ -1 +1 @@
(function(e){const t=e["es-co"]=e["es-co"]||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"%0 de %1","Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha","Block quote":"Cita de bloque",Bold:"Negrita","Bold text":"",Cancel:"Cancelar",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Código","Content editing keystrokes":"","Execute the currently focused button":"","Insert code block":"Insertar bloque de código",Italic:"Cursiva","Italic text":"",Justify:"Justificar","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","Open the accessibility help dialog":"","Plain text":"Texto plano","Remove color":"Quitar color","Restore default":"Restaurar valores predeterminados",Save:"Guardar","Show more items":"Mostrar más elementos",Strikethrough:"Tachado","Strikethrough text":"",Subscript:"Subíndice",Superscript:"Superíndice","Text alignment":"Alineación de texto","Text alignment toolbar":"Herramientas de alineación de texto","These keyboard shortcuts allow for quick access to content editing features.":"","Toggle caption off":"","Toggle caption on":"",Underline:"Subrayado","Underline text":"","Upload in progress":"Carga en progreso","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":""});t.getPluralForm=function(e){return e==1?0:e!=0&&e%1e6==0?1:2}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
!function(e){const t=e["es-co"]=e["es-co"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 de %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Grande","Bitcoin sign":"",Black:"","Block quote":"Cita de bloque",Blue:"","Blue marker":"Marcador azul",Bold:"Negrita","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"Cancelar","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Código","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"Copiar contenido seleccionado","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"Por defecto","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"Colores del documento","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Color de fondo de fuente","Font Color":"Color de fuente","Font Family":"Familia de fuente","Font Size":"Tamaño de fuente","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"Marcador verde","Green pen":"Pincel verde",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"","Heading 1":"","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Resaltar","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"Enorme","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"Insertar bloque de código","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Cursiva","Italic text":"Texto en cursiva",Justify:"Justificar","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used wheLine truncated
@@ -1 +1 @@
(function(a){const e=a["es"]=a["es"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(puede requerir <kbd>Fn</kbd>)","%0 of %1":"%0 de %1",Accept:"Aceptar","Accessibility help":"Ayuda de accesibilidad","Align cell text to the bottom":"Alinear texto de celda hacia abajo","Align cell text to the center":"Centrar texto de celda","Align cell text to the left":"Alinear texto de celda a la izquierda","Align cell text to the middle":"Alinear texto de celda al medio","Align cell text to the right":"Alinear texto de celda a la derecha","Align cell text to the top":"Alinear texto de celda hacia arriba","Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha","Align table to the left":"Alinear tabla a la izquierda","Align table to the right":"Alinear tabla a la derecha",Alignment:"Alineación",All:"Todos","Almost equal to":"Casi igual a",Angle:"Ángulo","Approximately equal to":"Aproximadamente igual a",Aquamarine:"Aguamarina",Arrows:"Flechas","Asterisk operator":"Operador asterisco","Austral sign":"Signo de austral","back with leftwards arrow above":"«back» con una flecha hacia la izquierda arriba",Background:"Fondo","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"A continuación, encontrará una lista de atajos de teclado que se pueden utilizar en el editor.",Big:"Grande","Bitcoin sign":"Signo del bitcóin",Black:"Negro","Block quote":"Bloque de cita",Blue:"Azul","Blue marker":"Marcador azul",Bold:"Negrita","Bold text":"Texto en negrita",Border:"Borde","Break text":"Permitir quebrar texto","Bulleted List":"Lista con viñetas","Bulleted list styles toolbar":"Estilos de lista con viñetas",Cancel:"Cancelar","Caption for image: %0":"Título de la imagen: %0","Caption for the image":"Descripción de la imagen","Cedi sign":"Signo de cedi","Cell properties":"Propiedades de celda","Cent sign":"Signo del centavo","Center table":"Centrar tabla","Centered image":"Imagen centrada","Change image text alternative":"Cambiar el texto alternativo de la imagen","Character categories":"Categorías de caracteres","Choose heading":"Elegir Encabezado",Circle:"Círculo",Clear:"Borrar","Click to edit block":"Haz clic para editar el bloque",Close:"Cerrar","Close contextual balloons, dropdowns, and dialogs":"Cierra globos contextuales, menús desplegables y cuadros de diálogo",Code:"Código","Colon sign":"Signo del colón",Color:"Color","Color picker":"Selector de color",Column:"Columna","Contains as member":"Contiene como miembro","Content editing keystrokes":"Teclas de edición de contenido","Copy selected content":"Copia el contenido seleccionado","Copyright sign":"Signo de derechos de autor","Create link":"Crea un enlace","Cruzeiro sign":"Signo del cruceiro",Currency:"Monedas","Currency sign":"Signo monetario",Dashed:"Línea discontinua",Decimal:"Decimal","Decimal with leading zero":"Decimal con cero","Decrease indent":"Disminuir sangría","Decrease list item indent":"Reduce la sangría de los elementos de la lista",Default:"Por defecto","Degree sign":"Signo de grado","Delete column":"Eliminar columna","Delete row":"Eliminar fila","Dim grey":"Gris oscuro",Dimensions:"Dimensiones",Disc:"Disco","Division sign":"Signo de división","Document colors":"Colores del documento","Dollar sign":"Signo del dólar","Dong sign":"Signo de dong",Dotted:"Línea de puntos",Double:"Doble línea","Double dagger":"Cruz doble","Double exclamation mark":"Signo de exclamación doble","Double low-9 quotation mark":"Comilla tipográfica en forma de 9 doble y baja","Double question mark":"Signo de interrogación doble",Downloadable:"Descargable","downwards arrow to bar":"flecha hacia abajo hasta una barra","downwards dashed arrow":"flecha punteada hacia abajo","downwards double arrow":"flecha doble hacia abajo","downwards simple arrow":"flecha simple hacia abajo","Drachma sign":"Signo de dracma","Drag to move":"Arrastra para mover","Dropdown toolbar":"Barra de herramientas desplegable","Edit block":"Cuadro de edición","Edit link":"Editar enlace","Edit source":"Editar fuente","Editor block content toolbar":"Barra de herramientas de contenido del bloque del editor","Editor contextual toolbar":"Barra de herramientas contextual del editor","Editor dialog":"Diálogo del editor","Editor editing area: %0":"Área de edición del editor: %0","Editor toolbar":"Barra de herramientas de edición","Element of":"Elemento de","Em dash":"Raya","Empty set":"Conjunto vacío","Empty snippet content":"Fragmento vacío","En dash":"Semirraya","end with leftwards arrow above":"«end» con una flecha hacia la izquierda arriba","Enter image caption":"Introducir título de la imagen","Enter table caption":"Ingresar título de tabla","Euro sign":"Signo del euro","Euro-currency sign":"Signo de la moneda euro","Exclamation question mark":"Signo de interrogación exclamativa","Execute the currently focused button":"Ejecuta el botón actualmente enfocado","Font Background Color":Line truncated
!function(a){const e=a.es=a.es||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(puede requerir <kbd>Fn</kbd>)","%0 of %1":"%0 de %1",Accept:"Aceptar",Accessibility:"Accesibilidad","Accessibility help":"Ayuda de accesibilidad","Align cell text to the bottom":"Alinear texto de celda hacia abajo","Align cell text to the center":"Centrar texto de celda","Align cell text to the left":"Alinear texto de celda a la izquierda","Align cell text to the middle":"Alinear texto de celda al medio","Align cell text to the right":"Alinear texto de celda a la derecha","Align cell text to the top":"Alinear texto de celda hacia arriba","Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha","Align table to the left":"Alinear tabla a la izquierda","Align table to the right":"Alinear tabla a la derecha",Alignment:"Alineación",All:"Todos","Almost equal to":"Casi igual a",Angle:"Ángulo","Approximately equal to":"Aproximadamente igual a",Aquamarine:"Aguamarina",Arrows:"Flechas","Asterisk operator":"Operador asterisco","Austral sign":"Signo de austral","back with leftwards arrow above":"«back» con una flecha hacia la izquierda arriba",Background:"Fondo","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"A continuación, encontrará una lista de atajos de teclado que se pueden utilizar en el editor.",Big:"Grande","Bitcoin sign":"Signo del bitcóin",Black:"Negro","Block quote":"Bloque de cita",Blue:"Azul","Blue marker":"Marcador azul",Bold:"Negrita","Bold text":"Texto en negrita",Border:"Borde","Break text":"Permitir quebrar texto","Bulleted List":"Lista con viñetas","Bulleted list styles toolbar":"Estilos de lista con viñetas",Cancel:"Cancelar","Caption for image: %0":"Título de la imagen: %0","Caption for the image":"Descripción de la imagen",Category:"Categoría","Cedi sign":"Signo de cedi","Cell properties":"Propiedades de celda","Cent sign":"Signo del centavo","Center table":"Centrar tabla","Centered image":"Imagen centrada","Change image text alternative":"Cambiar el texto alternativo de la imagen","Choose heading":"Elegir Encabezado",Circle:"Círculo",Clear:"Borrar","Click to edit block":"Haz clic para editar el bloque",Close:"Cerrar","Close contextual balloons, dropdowns, and dialogs":"Cierra globos contextuales, menús desplegables y cuadros de diálogo",Code:"Código","Code block":"Bloque de código","Colon sign":"Signo del colón",Color:"Color","Color picker":"Selector de color",Column:"Columna","Contains as member":"Contiene como miembro","Content editing keystrokes":"Teclas de edición de contenido","Copy selected content":"Copia el contenido seleccionado","Copyright sign":"Signo de derechos de autor","Create link":"Crea un enlace","Cruzeiro sign":"Signo del cruceiro",Currency:"Monedas","Currency sign":"Signo monetario",Custom:"Personalizar","Custom image size":"Personalizar tamaño de imagen",Dashed:"Línea discontinua",Decimal:"Decimal","Decimal with leading zero":"Decimal con cero","Decrease indent":"Disminuir sangría","Decrease list item indent":"Reduce la sangría de los elementos de la lista",Default:"Por defecto","Degree sign":"Signo de grado","Delete column":"Eliminar columna","Delete row":"Eliminar fila","Dim grey":"Gris oscuro",Dimensions:"Dimensiones",Disc:"Disco","Division sign":"Signo de división","Document colors":"Colores del documento","Dollar sign":"Signo del dólar","Dong sign":"Signo de dong",Dotted:"Línea de puntos",Double:"Doble línea","Double dagger":"Cruz doble","Double exclamation mark":"Signo de exclamación doble","Double low-9 quotation mark":"Comilla tipográfica en forma de 9 doble y baja","Double question mark":"Signo de interrogación doble",Downloadable:"Descargable","downwards arrow to bar":"flecha hacia abajo hasta una barra","downwards dashed arrow":"flecha punteada hacia abajo","downwards double arrow":"flecha doble hacia abajo","downwards simple arrow":"flecha simple hacia abajo","Drachma sign":"Signo de dracma","Drag to move":"Arrastra para mover","Dropdown menu":"Menú desplegable","Dropdown toolbar":"Barra de herramientas desplegable","Edit block":"Cuadro de edición","Edit link":"Editar enlace","Edit source":"Editar fuente","Editor block content toolbar":"Barra de herramientas de contenido del bloque del editor","Editor contextual toolbar":"Barra de herramientas contextual del editor","Editor dialog":"Diálogo del editor","Editor menu bar":"Barra de menú del editor","Editor toolbar":"Barra de herramientas de edición","Element of":"Elemento de","Em dash":"Raya","Empty set":"Conjunto vacío","Empty snippet content":"Fragmento vacío","En dash":"Semirraya","end with leftwards arrow above":"«end» con una flecha hacia la izquierda arriba","Enter image caption":"Introducir título de la imagen","Enter table caption":"Ingresar título de tabla","Entering %0 code snippet":"Ingresando fragmento de código %0","Entering a to-do list":"Ingresando lista de tareas pendieLine truncated
@@ -1 +1 @@
(function(a){const i=a["et"]=a["et"]||{};i.dictionary=Object.assign(i.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(võib vajada klahvi <kbd>Fn</kbd>)","%0 of %1":"%0 / %1",Accept:"Nõustu","Accessibility help":"Juurdepääsu abi","Align cell text to the bottom":"Lahtri tekst all","Align cell text to the center":"Lahtri tekst keskel","Align cell text to the left":"Lahtri tekst vasakul","Align cell text to the middle":"Lahtri tekst kõrguse järgi keskel","Align cell text to the right":"Lahtri tekst paremal","Align cell text to the top":"Lahtri tekst üleval","Align center":"Keskjoondus","Align left":"Vasakjoondus","Align right":"Paremjoondus","Align table to the left":"Tabel joondatud vasakule","Align table to the right":"Tabel joondatud paremale",Alignment:"Joondus",All:"Kõik","Almost equal to":"Peaaegu võrdne",Angle:"Nurk","Approximately equal to":"Ligikaudu võrdne",Aquamarine:"Akvamariin",Arrows:"Nooled","Asterisk operator":"Tärnisisestaja","Austral sign":"Australimärk","back with leftwards arrow above":"BACK ülemise vasaknoolega",Background:"Taust","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Altpoolt leiad redaktoris kasutatavad klahvikombinatsioonid.",Big:"Suur","Bitcoin sign":"Bitcoini märk",Black:"Must","Block quote":"Tsitaat",Blue:"Sinine","Blue marker":"Sinine marker",Bold:"Rasvane","Bold text":"Paks tekst",Border:"Ääris","Break text":"Murra teksti","Bulleted List":"Punktidega loetelu","Bulleted list styles toolbar":"Täpploendi stiili tööriistariba",Cancel:"Loobu","Caption for image: %0":"Pildi pealkiri: %0","Caption for the image":"Pildi pealkiri","Cedi sign":"Sedimärk","Cell properties":"Lahtri omadused","Cent sign":"Sendi märk","Center table":"Tabel joondatud keskele","Centered image":"Keskele joondatud pilt","Change image text alternative":"Muuda pildi asenduskirjeldust","Character categories":"Märkide kategooriad","Choose heading":"Vali pealkiri",Circle:"Ring",Clear:"Selge","Click to edit block":"Ploki muutmiseks klõpsa",Close:"Sulge","Close contextual balloons, dropdowns, and dialogs":"Sulge konteksti mullid, rippmenüüd ja dialoogid",Code:"Kood","Colon sign":"Koolon",Color:"Värvus","Color picker":"Värvi valija",Column:"Veerg","Contains as member":"Sisaldab liikmena","Content editing keystrokes":"Sisu muutmise klahvikombinatsioonid","Copy selected content":"Kopeeri valitud sisu","Copyright sign":"Autoriõigusmärk","Create link":"Loo link","Cruzeiro sign":"Kruseiromärk",Currency:"Valuuta","Currency sign":"Valuutamärk",Dashed:"Kriipsjoon",Decimal:"Kümnend","Decimal with leading zero":"Nulliga kümnendsüsteem","Decrease indent":"Vähenda taanet","Decrease list item indent":"Vähenda loendi taanet",Default:"Vaikimisi","Degree sign":"Kraadimärk","Delete column":"Kustuta veerg","Delete row":"Kustuta rida","Dim grey":"Tumehall",Dimensions:"Mõõtmed",Disc:"Ketas","Division sign":"Jagamismärk","Document colors":"Dokumendi värvid","Dollar sign":"Dollarimärk","Dong sign":"Dongimärk",Dotted:"Punktiir",Double:"Topelt","Double dagger":"Topeltpistoda","Double exclamation mark":"Topelthüüumärk","Double low-9 quotation mark":"Kahekordsed madalad üheksakujulised jutumärgid","Double question mark":"Topeltküsimärk",Downloadable:"Allalaaditav","downwards arrow to bar":"kriipsu suunatud allanool","downwards dashed arrow":"katkendnool alla","downwards double arrow":"topeltnool alla","downwards simple arrow":"allapoole suunatud lihtne nool","Drachma sign":"Drahmimärk","Drag to move":"Liigutamiseks lohista","Dropdown toolbar":"Avatav tööriistariba","Edit block":"Muuda plokki","Edit link":"Muuda linki","Edit source":"Muuda allikat","Editor block content toolbar":"Redigeerija ploki sisu tööriistariba","Editor contextual toolbar":"Redigeerija kontekstuaalne tööriistariba","Editor dialog":"Muutja dialoog","Editor editing area: %0":"Redaktori redigeerimisala: %0","Editor toolbar":"Redaktori tööriistariba","Element of":"Esineb elemendina","Em dash":"Mõttekriips","Empty set":"Tühihulk","Empty snippet content":"Tühi jupi sisu","En dash":"Sidekriips","end with leftwards arrow above":"LÕPP ülemise vasaknoolega","Enter image caption":"Sisesta pildi pealkiri","Enter table caption":"Sisesta tabeli pealdis","Euro sign":"Euro märk","Euro-currency sign":"Euromärk","Exclamation question mark":"Hüüuküsimärk","Execute the currently focused button":"Kasuta praegu aktiivset nuppu","Font Background Color":"Kirja tausta värvus","Font Color":"Fondi värvus","Font Family":"Kirjastiil","Font Size":"Teksti suurus","For all":"Kõigile","Fraction slash":"Kaldus murrupoolitaja","French franc sign":"Prantsuse frangi märk","Full size image":"Täissuuruses pilt","German penny sign":"Saksa penni märk","Greater-than or equal to":"Suurem-kui või võrdne","Greater-than sign":"Suurem-kui märk",Green:"Roheline","Green marker":"Roheline marker","Green pen":"Roheline pliiats",Grey:"Hall",Groove:"Kraav","Guarani sign":"Guaraniimärk","Header column":"PäiLine truncated
!function(a){const i=a.et=a.et||{};i.dictionary=Object.assign(i.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(võib vajada klahvi <kbd>Fn</kbd>)","%0 of %1":"%0 / %1",Accept:"Nõustu",Accessibility:"Juurdepääsetavus","Accessibility help":"Juurdepääsu abi","Align cell text to the bottom":"Lahtri tekst all","Align cell text to the center":"Lahtri tekst keskel","Align cell text to the left":"Lahtri tekst vasakul","Align cell text to the middle":"Lahtri tekst kõrguse järgi keskel","Align cell text to the right":"Lahtri tekst paremal","Align cell text to the top":"Lahtri tekst üleval","Align center":"Keskjoondus","Align left":"Vasakjoondus","Align right":"Paremjoondus","Align table to the left":"Tabel joondatud vasakule","Align table to the right":"Tabel joondatud paremale",Alignment:"Joondus",All:"Kõik","Almost equal to":"Peaaegu võrdne",Angle:"Nurk","Approximately equal to":"Ligikaudu võrdne",Aquamarine:"Akvamariin",Arrows:"Nooled","Asterisk operator":"Tärnisisestaja","Austral sign":"Australimärk","back with leftwards arrow above":"BACK ülemise vasaknoolega",Background:"Taust","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Altpoolt leiad redaktoris kasutatavad klahvikombinatsioonid.",Big:"Suur","Bitcoin sign":"Bitcoini märk",Black:"Must","Block quote":"Tsitaat",Blue:"Sinine","Blue marker":"Sinine marker",Bold:"Rasvane","Bold text":"Paks tekst",Border:"Ääris","Break text":"Murra teksti","Bulleted List":"Punktidega loetelu","Bulleted list styles toolbar":"Täpploendi stiili tööriistariba",Cancel:"Loobu","Caption for image: %0":"Pildi pealkiri: %0","Caption for the image":"Pildi pealkiri",Category:"Kategooria","Cedi sign":"Sedimärk","Cell properties":"Lahtri omadused","Cent sign":"Sendi märk","Center table":"Tabel joondatud keskele","Centered image":"Keskele joondatud pilt","Change image text alternative":"Muuda pildi asenduskirjeldust","Choose heading":"Vali pealkiri",Circle:"Ring",Clear:"Selge","Click to edit block":"Ploki muutmiseks klõpsa",Close:"Sulge","Close contextual balloons, dropdowns, and dialogs":"Sulge konteksti mullid, rippmenüüd ja dialoogid",Code:"Kood","Code block":"Koodiplokk","Colon sign":"Koolon",Color:"Värvus","Color picker":"Värvi valija",Column:"Veerg","Contains as member":"Sisaldab liikmena","Content editing keystrokes":"Sisu muutmise klahvikombinatsioonid","Copy selected content":"Kopeeri valitud sisu","Copyright sign":"Autoriõigusmärk","Create link":"Loo link","Cruzeiro sign":"Kruseiromärk",Currency:"Valuuta","Currency sign":"Valuutamärk",Custom:"Enda valitud","Custom image size":"Enda valitud pildi suurus",Dashed:"Kriipsjoon",Decimal:"Kümnend","Decimal with leading zero":"Nulliga kümnendsüsteem","Decrease indent":"Vähenda taanet","Decrease list item indent":"Vähenda loendi taanet",Default:"Vaikimisi","Degree sign":"Kraadimärk","Delete column":"Kustuta veerg","Delete row":"Kustuta rida","Dim grey":"Tumehall",Dimensions:"Mõõtmed",Disc:"Ketas","Division sign":"Jagamismärk","Document colors":"Dokumendi värvid","Dollar sign":"Dollarimärk","Dong sign":"Dongimärk",Dotted:"Punktiir",Double:"Topelt","Double dagger":"Topeltpistoda","Double exclamation mark":"Topelthüüumärk","Double low-9 quotation mark":"Kahekordsed madalad üheksakujulised jutumärgid","Double question mark":"Topeltküsimärk",Downloadable:"Allalaaditav","downwards arrow to bar":"kriipsu suunatud allanool","downwards dashed arrow":"katkendnool alla","downwards double arrow":"topeltnool alla","downwards simple arrow":"allapoole suunatud lihtne nool","Drachma sign":"Drahmimärk","Drag to move":"Liigutamiseks lohista","Dropdown menu":"Rippmenüü","Dropdown toolbar":"Avatav tööriistariba","Edit block":"Muuda plokki","Edit link":"Muuda linki","Edit source":"Muuda allikat","Editor block content toolbar":"Redigeerija ploki sisu tööriistariba","Editor contextual toolbar":"Redigeerija kontekstuaalne tööriistariba","Editor dialog":"Muutja dialoog","Editor menu bar":"Redaktori menüüriba","Editor toolbar":"Redaktori tööriistariba","Element of":"Esineb elemendina","Em dash":"Mõttekriips","Empty set":"Tühihulk","Empty snippet content":"Tühi jupi sisu","En dash":"Sidekriips","end with leftwards arrow above":"LÕPP ülemise vasaknoolega","Enter image caption":"Sisesta pildi pealkiri","Enter table caption":"Sisesta tabeli pealdis","Entering %0 code snippet":"%0 koodilõigu avamine","Entering a to-do list":"Tulevaste tegevuste nimekirja avamine","Entering code snippet":"Koodilõigu avamine","Error during image upload":"Viga pildi üleslaadimisel","Euro sign":"Euro märk","Euro-currency sign":"Euromärk","Exclamation question mark":"Hüüuküsimärk","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"Vajuta praegu aktiivset nuppu. Redaktori sisu muutvate nuppude vajutamine viib tähelepanu taas sisule.","Font Background Color":"Kirja tausta värvus","Font Color":"Fondi Line truncated
@@ -1 +1 @@
(function(e){const t=e["eu"]=e["eu"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"","Accessibility help":"",Aquamarine:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Black:"","Block quote":"Aipua",Blue:"",Bold:"Lodia","Bold text":"","Break text":"","Bulleted List":"Buletdun zerrenda","Bulleted list styles toolbar":"",Cancel:"Utzi","Caption for image: %0":"","Caption for the image":"","Centered image":"Zentratutako irudia","Change image text alternative":"Aldatu irudiaren ordezko testua","Choose heading":"Aukeratu izenburua",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kodea","Content editing keystrokes":"","Create link":"",Decimal:"","Decimal with leading zero":"","Decrease list item indent":"","Dim grey":"",Disc:"",Downloadable:"","Drag to move":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"","Enter image caption":"Sartu irudiaren epigrafea","Execute the currently focused button":"","Full size image":"Tamaina osoko irudia",Green:"",Grey:"",Heading:"Izenburua","Heading 1":"Izenburua 1","Heading 2":"Izenburua 2","Heading 3":"Izenburua 3","Heading 4":"","Heading 5":"","Heading 6":"","Help Contents. To close this dialog press ESC.":"",HEX:"","Image resize list":"","Image toolbar":"","image widget":"irudi widgeta","In line":"","Increase list item indent":"",Insert:"","Insert image":"Txertatu irudia","Insert image via URL":"","Invalid start index value.":"",Italic:"Etzana","Italic text":"","Keystrokes that can be used in a list":"","Left aligned image":"Ezkerrean lerrokatutako irudia","Light blue":"","Light green":"","Light grey":"",Link:"Esteka","Link image":"","Link URL":"Estekaren URLa","List properties":"","Lower-latin":"","Lower–roman":"","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Navigate through the toolbar":"",Next:"","No results found":"","No searchable items":"","Numbered List":"Zenbakidun zerrenda","Numbered list styles toolbar":"","Open in a new tab":"","Open link in new tab":"","Open the accessibility help dialog":"",Orange:"",Original:"",Paragraph:"Paragrafoa","Press %0 for help.":"",Previous:"",Purple:"",Red:"",Redo:"Berregin","Remove color":"","Replace from computer":"","Replace image":"","Replace image from computer":"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Restore default":"","Reversed order":"","Rich Text Editor":"Testu aberastuaren editorea","Right aligned image":"Eskuinean lerrokatutako irudia",Save:"Gorde","Show more items":"","Side image":"Alboko irudia",Square:"","Start at":"","Start index must be greater than 0.":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"","Text alternative":"Ordezko testua","These keyboard shortcuts allow for quick access to content editing features.":"","This link has no URL":"","To-do List":"","Toggle caption off":"","Toggle caption on":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"",Turquoise:"","Type or paste your content here.":"","Type your title":"",Underline:"Azpimarra","Underline text":"",Undo:"Desegin",Unlink:"Desestekatu",Update:"","Update image URL":"","Upload failed":"Kargatzeak huts egin du","Upload from computer":"","Upload image from computer":"","Upper-latin":"","Upper-roman":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":"",White:"","Wrap text":"",Yellow:""});t.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
!function(t){const e=t.eu=t.eu||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"","Align left":"","Align right":"","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"Aipua",Blue:"","Blue marker":"",Bold:"Lodia","Bold text":"",Border:"","Break text":"","Bulleted List":"Buletdun zerrenda","Bulleted list styles toolbar":"",Cancel:"Utzi","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Zentratutako irudia","Change image text alternative":"Aldatu irudiaren ordezko testua","Choose heading":"Aukeratu izenburua",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kodea","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"Sartu irudiaren epigrafea","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"","Font Color":"","Font Family":"","Font Size":"","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Tamaina osoko irudia","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"Izenburua","Heading 1":"Izenburua 1","Heading 2":"Izenburua 2","Heading 3":"Izenburua 3","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"irudi widgeta","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"Txertatu irudia","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Etzana","Italic text":"",Justify:"","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Kip sign":"",Latin:"","Latin capital letter a with breve":"","Latin caLine truncated
@@ -1 +1 @@
(function(t){const e=t["fa"]=t["fa"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 از %1",Accept:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"متن سلول را در سمت راست تراز کنید","Align cell text to the top":"","Align center":"تراز وسط","Align left":"تراز چپ","Align right":"تراز راست","Align table to the left":"","Align table to the right":"جدول را در سمت راست تراز کنید",Alignment:"ترازبندی",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"زمرد کبود",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"زمینه","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"بزرگ","Bitcoin sign":"",Black:"سیاه","Block quote":" بلوک نقل قول",Blue:"آبی","Blue marker":"نشانگر آبی",Bold:"درشت","Bold text":"",Border:"حاشیه","Break text":"","Bulleted List":"لیست نشانه‌دار","Bulleted list styles toolbar":"",Cancel:"لغو","Caption for image: %0":"","Caption for the image":"","Cedi sign":"","Cell properties":"خصوصیات سلول","Cent sign":"","Center table":"جدول وسط","Centered image":"تصویر در وسط","Change image text alternative":"تغییر متن جایگزین تصویر","Character categories":"","Choose heading":"انتخاب عنوان",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"کد","Colon sign":"",Color:"رنگ","Color picker":"",Column:"ستون","Contains as member":"","Content editing keystrokes":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Dashed:"نقطه چین",Decimal:"","Decimal with leading zero":"","Decrease indent":"کاهش تورفتگی","Decrease list item indent":"",Default:"پیش فرض","Degree sign":"","Delete column":"حذف ستون","Delete row":"حذف سطر","Dim grey":"خاکستری تیره",Dimensions:"ابعاد",Disc:"","Division sign":"","Document colors":"رنگ اسناد","Dollar sign":"","Dong sign":"",Dotted:"خط چین",Double:"دوبل","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"قابل بارگیری","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"downwards double arrow","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown toolbar":"نوارابزار کشویی","Edit block":"ویرایش قطعه","Edit link":"ویرایش پیوند","Edit source":"ویرایش سورس","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"نوارابزار ویرایشگر","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"عنوان تصویر را وارد کنید","Enter table caption":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button":"","Font Background Color":"رنگ پس زمینه فونت","Font Color":"رنگ فونت","Font Family":"خانواده فونت","Font Size":"اندازه فونت","For all":"","Fraction slash":"","French franc sign":"","Full size image":"تصویر در اندازه کامل","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"سبز","Green marker":"نشانگر سبز","Green pen":"قلم سبز",Grey:"خاکستری",Groove:"خط دار کردن","Guarani sign":"","Header column":"ستون سربرگ","Header row":"سطر سربرگ",Heading:"عنوان","Heading 1":"عنوان 1","Heading 2":"عنوان 2","Heading 3":"عنوان 3","Heading 4":"عنوان 4","Heading 5":"عنوان 5","Heading 6":"عنوان 6",Height:"ارتفاع","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"برجسته","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML snippet":"",Huge:"بسیار بزرگ","Identical to":"","Image resize list":"","Image toolbar":"نوارابزار تصویر","image widget":"ابزاره تصویر","In line":"","Increase indent":"افزایش تورفتگی","Increase list item indent":"","Indian rupee sign":"",Infinity:"",Insert:"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert code block":"درج بلوک کد","Insert column left":"درج ستون در سمت چپ","Insert column right":"درج ستون در سمت راست","Insert HTML":"وارد کردن html","ILine truncated
!function(t){const e=t.fa=t.fa||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 از %1",Accept:"پذیرفتن",Accessibility:"دسترسی","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"متن سلول را در سمت راست تراز کنید","Align cell text to the top":"","Align center":"تراز وسط","Align left":"تراز چپ","Align right":"تراز راست","Align table to the left":"","Align table to the right":"جدول را در سمت راست تراز کنید",Alignment:"ترازبندی",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"زمرد کبود",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"زمینه","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"در زیر، می توانید لیستی از میانبرهای صفحه کلید را که می توان در ویرایشگر استفاده کرد، پیدا کنید.",Big:"بزرگ","Bitcoin sign":"",Black:"سیاه","Block quote":" بلوک نقل قول",Blue:"آبی","Blue marker":"نشانگر آبی",Bold:"درشت","Bold text":"",Border:"حاشیه","Break text":"","Bulleted List":"لیست نشانه‌دار","Bulleted list styles toolbar":"",Cancel:"لغو","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"خصوصیات سلول","Cent sign":"","Center table":"جدول وسط","Centered image":"تصویر در وسط","Change image text alternative":"تغییر متن جایگزین تصویر","Choose heading":"انتخاب عنوان",Circle:"",Clear:"","Click to edit block":"برای ویرایش بلوک کلیک کنید",Close:"بستن","Close contextual balloons, dropdowns, and dialogs":"",Code:"کد","Code block":"","Colon sign":"",Color:"رنگ","Color picker":"",Column:"ستون","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"نقطه چین",Decimal:"","Decimal with leading zero":"","Decrease indent":"کاهش تورفتگی","Decrease list item indent":"",Default:"پیش فرض","Degree sign":"","Delete column":"حذف ستون","Delete row":"حذف سطر","Dim grey":"خاکستری تیره",Dimensions:"ابعاد",Disc:"","Division sign":"","Document colors":"رنگ اسناد","Dollar sign":"","Dong sign":"",Dotted:"خط چین",Double:"دوبل","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"قابل بارگیری","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"downwards double arrow","downwards simple arrow":"","Drachma sign":"","Drag to move":"برای حرکت دادن بکشید","Dropdown menu":"","Dropdown toolbar":"نوارابزار کشویی","Edit block":"ویرایش قطعه","Edit link":"ویرایش پیوند","Edit source":"ویرایش سورس","Editor block content toolbar":"نوار ابزار محتوای بلوک ویرایشگر","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"نوارابزار ویرایشگر","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"عنوان تصویر را وارد کنید","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"رنگ پس زمینه فونت","Font Color":"رنگ فونت","Font Family":"خانواده فونت","Font Size":"اندازه فونت","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"تصویر در اندازه کامل","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"سبز","Green marker":"نشانگر سبز","Green pen":"قلم سبز",Grey:"خاکستری",Groove:"خط دار کردن","Guarani sign":"","Header column":"ستون سربرگ","Header row":"سطر سربرگ",Heading:"عنوان","Heading 1":"عنوان 1","Heading 2":"عنوان 2","Heading 3":"عنوان 3","Heading 4":"عنوان 4","Heading 5":"عنوان 5","Heading 6":"عنوان 6",Height:"ارتفاع","Help Contents. To close this dialog press ESC.":"",HEX:"هگز",Highlight:"برجسته","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object"Line truncated
@@ -1 +1 @@
(function(a){const i=a["fi"]=a["fi"]||{};i.dictionary=Object.assign(i.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(Saattaa vaatia <kbd>Fn</kbd>:n)","%0 of %1":"%0 / %1",Accept:"Hyväksy","Accessibility help":"Esteettömyystuki","Align cell text to the bottom":"Siirrä solun teksti alaosaan","Align cell text to the center":"Siirrä solun teksti keskelle","Align cell text to the left":"Siirrä solun teksti vasemmalle","Align cell text to the middle":"Siirrä solun teksti keskiosaan","Align cell text to the right":"Siirrä solun teksti oikealle","Align cell text to the top":"Siirrä solun teksti yläosaan","Align center":"Tasaa keskelle","Align left":"Tasaa vasemmalle","Align right":"Tasaa oikealle","Align table to the left":"Siirrä taulukko vasemmalle","Align table to the right":"Siirrä taulukko oikealle",Alignment:"Suunta",All:"Kaikki","Almost equal to":"Likimain yhtä suuri kuin -merkki",Angle:"Kulma","Approximately equal to":"Suunnilleen yhtä suuri kuin -merkki",Aquamarine:"Akvamariini",Arrows:"Nuolet","Asterisk operator":"Asteriskioperaattori","Austral sign":"Australin merkki","back with leftwards arrow above":"BACK-nuoli",Background:"Tausta","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Ohessa on tässä editointityökalussa käytettävien näppäinoikoteiden lista.",Big:"Suuri","Bitcoin sign":"Bitcoinin merkki",Black:"Musta","Block quote":"Lainaus",Blue:"Sininen","Blue marker":"Sininen tussi",Bold:"Lihavointi","Bold text":"Lihavoitu teksti",Border:"Reunus","Break text":"Irrota teksti","Bulleted List":"Lista","Bulleted list styles toolbar":"Luetelmalistan työkalupalkki",Cancel:"Peruuta","Caption for image: %0":"Kuvan kuvateksti: %0","Caption for the image":"Kuvan kuvateksti","Cedi sign":"Cedin merkki","Cell properties":"Solun ominaisuudet","Cent sign":"Sentin merkki","Center table":"Keskitä taulukko","Centered image":"Keskitetty kuva","Change image text alternative":"Vaihda kuvan vaihtoehtoinen teksti","Character categories":"Merkkiluokat","Choose heading":"Valitse otsikko",Circle:"Ympyrä",Clear:"Tyhjennä","Click to edit block":"Muokkaa lohkoa klikkaamalla",Close:"Sulje","Close contextual balloons, dropdowns, and dialogs":"Sulje kontekstipallot, pudotusvalikot ja dialogit",Code:"Koodi","Colon sign":"Colónin merkki",Color:"Väri","Color picker":"Värin valitsin",Column:"Sarake","Contains as member":"Käänteisen joukkoon kuulumisen merkki","Content editing keystrokes":"Sisällönmuokkauspainallukset","Copy selected content":"Kopioi valittu sisältö","Copyright sign":"Tekijänoikeusmerkki","Create link":"Luo linkki","Cruzeiro sign":"Cruzeiron merkki",Currency:"Valuutta","Currency sign":"Valuuttamerkki",Dashed:"Katkoviiva",Decimal:"Desimaali","Decimal with leading zero":"Nolla alussa -desimaali","Decrease indent":"Vähennä sisennystä","Decrease list item indent":"Vähennä listanimikkeen sisennystä",Default:"Oletus","Degree sign":"Asteen merkki","Delete column":"Poista sarake","Delete row":"Poista rivi","Dim grey":"Vaaleanharmaa",Dimensions:"Mittasuhteet",Disc:"Levy","Division sign":"Jakomerkki","Document colors":"Asiakirjan värit","Dollar sign":"Dollarin merkki","Dong sign":"Dongin merkki",Dotted:"Pisteviiva",Double:"Kaksinkertainen","Double dagger":"Kaksoisristi","Double exclamation mark":"Kaksoishuutomerkki","Double low-9 quotation mark":"Rivinalinen kokolainausmerkki","Double question mark":"Kaksoiskysymysmerkki",Downloadable:"Ladattava","downwards arrow to bar":"nuoli alas perusviivalla","downwards dashed arrow":"pisteviivanuoli alas","downwards double arrow":"kaksoisnuoli alas","downwards simple arrow":"yksinkertainen nuoli alas","Drachma sign":"Drakman merkki","Drag to move":"Siirrä raahamalla","Dropdown toolbar":"Pudotusvalikon työkalupalkki","Edit block":"Muokkaa lohkoa","Edit link":"Muokkaa linkkiä","Edit source":"Muokkaa lähdettä","Editor block content toolbar":"Editorin lohkon sisällön työkalupalkki","Editor contextual toolbar":"Editorin kontekstuaalinen työkalupalkki","Editor dialog":"Editorin dialogi","Editor editing area: %0":"Editorin muokkausalue: %0","Editor toolbar":"Editorin työkalupalkki","Element of":"Joukkoon kuulumisen merkki","Em dash":"M-viiva","Empty set":"Tyhjän joukon merkki","Empty snippet content":"Tyhjä pätkäsisältö","En dash":"N-viiva","end with leftwards arrow above":"END-nuoli","Enter image caption":"Syötä kuvateksti","Enter table caption":"Syötä taulukon kuvaus","Euro sign":"Euron merkki","Euro-currency sign":"Eurovaluutan merkki","Exclamation question mark":"Huutomerkki ja kysymysmerkki","Execute the currently focused button":"Käytä tällä hetkellä kohteena olevaa painiketta","Font Background Color":"Fontin taustaväri","Font Color":"Fontin väri","Font Family":"Fonttiperhe","Font Size":"Fontin koko","For all":"Kaikkikvanttori","Fraction slash":"Murtoluvun vinoviiva","French franc sign":"Ranskan frangin merkki","Full size image":"Täysikokoinen kuva","German penny sign":"Saksan pfennigin merkkLine truncated
!function(a){const i=a.fi=a.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(Saattaa vaatia <kbd>Fn</kbd>:n)","%0 of %1":"%0 / %1",Accept:"Hyväksy",Accessibility:"Käytettävyys","Accessibility help":"Esteettömyystuki","Align cell text to the bottom":"Siirrä solun teksti alaosaan","Align cell text to the center":"Siirrä solun teksti keskelle","Align cell text to the left":"Siirrä solun teksti vasemmalle","Align cell text to the middle":"Siirrä solun teksti keskiosaan","Align cell text to the right":"Siirrä solun teksti oikealle","Align cell text to the top":"Siirrä solun teksti yläosaan","Align center":"Tasaa keskelle","Align left":"Tasaa vasemmalle","Align right":"Tasaa oikealle","Align table to the left":"Siirrä taulukko vasemmalle","Align table to the right":"Siirrä taulukko oikealle",Alignment:"Suunta",All:"Kaikki","Almost equal to":"Likimain yhtä suuri kuin -merkki",Angle:"Kulma","Approximately equal to":"Suunnilleen yhtä suuri kuin -merkki",Aquamarine:"Akvamariini",Arrows:"Nuolet","Asterisk operator":"Asteriskioperaattori","Austral sign":"Australin merkki","back with leftwards arrow above":"BACK-nuoli",Background:"Tausta","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Ohessa on tässä editointityökalussa käytettävien näppäinoikoteiden lista.",Big:"Suuri","Bitcoin sign":"Bitcoinin merkki",Black:"Musta","Block quote":"Lainaus",Blue:"Sininen","Blue marker":"Sininen tussi",Bold:"Lihavointi","Bold text":"Lihavoitu teksti",Border:"Reunus","Break text":"Irrota teksti","Bulleted List":"Lista","Bulleted list styles toolbar":"Luetelmalistan työkalupalkki",Cancel:"Peruuta","Caption for image: %0":"Kuvan kuvateksti: %0","Caption for the image":"Kuvan kuvateksti",Category:"Kategoria","Cedi sign":"Cedin merkki","Cell properties":"Solun ominaisuudet","Cent sign":"Sentin merkki","Center table":"Keskitä taulukko","Centered image":"Keskitetty kuva","Change image text alternative":"Vaihda kuvan vaihtoehtoinen teksti","Choose heading":"Valitse otsikko",Circle:"Ympyrä",Clear:"Tyhjennä","Click to edit block":"Muokkaa lohkoa klikkaamalla",Close:"Sulje","Close contextual balloons, dropdowns, and dialogs":"Sulje kontekstipallot, pudotusvalikot ja dialogit",Code:"Koodi","Code block":"Koodilohko","Colon sign":"Colónin merkki",Color:"Väri","Color picker":"Värin valitsin",Column:"Sarake","Contains as member":"Käänteisen joukkoon kuulumisen merkki","Content editing keystrokes":"Sisällönmuokkauspainallukset","Copy selected content":"Kopioi valittu sisältö","Copyright sign":"Tekijänoikeusmerkki","Create link":"Luo linkki","Cruzeiro sign":"Cruzeiron merkki",Currency:"Valuutta","Currency sign":"Valuuttamerkki",Custom:"Mukautettu","Custom image size":"Mukautettu kuvakoko",Dashed:"Katkoviiva",Decimal:"Desimaali","Decimal with leading zero":"Nolla alussa -desimaali","Decrease indent":"Vähennä sisennystä","Decrease list item indent":"Vähennä listanimikkeen sisennystä",Default:"Oletus","Degree sign":"Asteen merkki","Delete column":"Poista sarake","Delete row":"Poista rivi","Dim grey":"Vaaleanharmaa",Dimensions:"Mittasuhteet",Disc:"Levy","Division sign":"Jakomerkki","Document colors":"Asiakirjan värit","Dollar sign":"Dollarin merkki","Dong sign":"Dongin merkki",Dotted:"Pisteviiva",Double:"Kaksinkertainen","Double dagger":"Kaksoisristi","Double exclamation mark":"Kaksoishuutomerkki","Double low-9 quotation mark":"Rivinalinen kokolainausmerkki","Double question mark":"Kaksoiskysymysmerkki",Downloadable:"Ladattava","downwards arrow to bar":"nuoli alas perusviivalla","downwards dashed arrow":"pisteviivanuoli alas","downwards double arrow":"kaksoisnuoli alas","downwards simple arrow":"yksinkertainen nuoli alas","Drachma sign":"Drakman merkki","Drag to move":"Siirrä raahamalla","Dropdown menu":"Pudotusvalikko","Dropdown toolbar":"Pudotusvalikon työkalupalkki","Edit block":"Muokkaa lohkoa","Edit link":"Muokkaa linkkiä","Edit source":"Muokkaa lähdettä","Editor block content toolbar":"Editorin lohkon sisällön työkalupalkki","Editor contextual toolbar":"Editorin kontekstuaalinen työkalupalkki","Editor dialog":"Editorin dialogi","Editor menu bar":"Muokkaustyökalun valikkopalkki","Editor toolbar":"Editorin työkalupalkki","Element of":"Joukkoon kuulumisen merkki","Em dash":"M-viiva","Empty set":"Tyhjän joukon merkki","Empty snippet content":"Tyhjä pätkäsisältö","En dash":"N-viiva","end with leftwards arrow above":"END-nuoli","Enter image caption":"Syötä kuvateksti","Enter table caption":"Syötä taulukon kuvaus","Entering %0 code snippet":"Syötetään koodinpätkä %0","Entering a to-do list":"Syötetään tehtävälista.","Entering code snippet":"Syötetään koodinpätkä","Error during image upload":"Virhe kuvaa ladattaessa","Euro sign":"Euron merkki","Euro-currency sign":"Eurovaluutan merkki","Exclamation question mark":"Huutomerkki ja kysymysmerkki","Execute the currently focused button. Executing buttons that interacLine truncated
@@ -1 +1 @@
(function(e){const t=e["fr"]=e["fr"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(peut nécessiter <kbd> Fn </kbd> )","%0 of %1":"%0 sur %1",Accept:"Accepter","Accessibility help":"Aide à l'accessibilité","Align cell text to the bottom":"Aligner le texte en bas","Align cell text to the center":"Aligner la cellule au centre","Align cell text to the left":"Aligner la cellule à gauche","Align cell text to the middle":"Aligner le texte au milieu","Align cell text to the right":"Aligner la cellule à droite","Align cell text to the top":"Aligner le texte en haut","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",All:"Tous","Almost equal to":"Presque égal à",Angle:"Angle","Approximately equal to":"Environ égal à",Aquamarine:"Bleu vert",Arrows:"Flèches","Asterisk operator":"Astérisque","Austral sign":"Austral","back with leftwards arrow above":"Précédent avec flèche vers la gauche",Background:"Fond","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Ci-dessous, vous trouverez une liste de raccourcis clavier pouvant être utilisés dans l’éditeur.",Big:"Grand","Bitcoin sign":"Bitcoin",Black:"Noir","Block quote":"Citation",Blue:"Bleu","Blue marker":"Marqueur bleu",Bold:"Gras","Bold text":"Texte en gras",Border:"Bordure","Break text":"Saut de ligne","Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Cancel:"Annuler","Caption for image: %0":"Légende de l'image : %0","Caption for the image":"Légende de l'image","Cedi sign":"Cédi","Cell properties":"Propriétés de la cellule","Cent sign":"Centime","Center table":"Centrer le tableau ","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Character categories":"Catégories de caractères","Choose heading":"Choisir l'en-tête",Circle:"Cercle",Clear:"Effacer","Click to edit block":"Cliquer pour modifier le bloc",Close:"Fermer","Close contextual balloons, dropdowns, and dialogs":"Fermer les bulles contextuelles, les listes déroulantes et les boîtes de dialogue",Code:"Code","Colon sign":"Deux points",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne","Contains as member":"Contient","Content editing keystrokes":"Touches d'édition de contenu","Copy selected content":"Copier le contenu sélectionné","Copyright sign":"Copyright","Create link":"Créer un lien","Cruzeiro sign":"Cruzeiro",Currency:"Devise","Currency sign":"Symbole monétaire",Dashed:"Tirets",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire","Decrease indent":"Diminuer le retrait","Decrease list item indent":"Diminuer le retrait des éléments de liste",Default:"Par défaut","Degree sign":"Degré","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne","Dim grey":"Gris pâle",Dimensions:"Dimensions",Disc:"Disque","Division sign":"Division","Document colors":"Couleurs du document","Dollar sign":"Dollar","Dong sign":"Dong",Dotted:"Pointillés",Double:"Double","Double dagger":"Croix de Lorraine","Double exclamation mark":"Double point d'exclamation","Double low-9 quotation mark":"Guillemet-virgule double inférieur","Double question mark":"Double point d'interrogation",Downloadable:"Fichier téléchargeable","downwards arrow to bar":"Flèche vers le bas avec barre de fin","downwards dashed arrow":"Flèche en pointillés vers le bas","downwards double arrow":"Double flèche vers le bas","downwards simple arrow":"flèche simple vers le bas","Drachma sign":"Drachme","Drag to move":"Faire glisser pour déplacer","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Edit source":"Modifier la source","Editor block content toolbar":"Barre d'outils du contenu du bloc éditeur","Editor contextual toolbar":"Barre d'outils contextuelle de l'éditeur","Editor dialog":"Boîte de dialogue de l'éditeur","Editor editing area: %0":"Zone d'édition de l'éditeur : %0","Editor toolbar":"Barre d'outils de l'éditeur","Element of":"Appartient à","Em dash":"Tiret long","Empty set":"Élément vide","Empty snippet content":"Aucun contenu pour ce fragment de code","En dash":"Tiret","end with leftwards arrow above":"Fin avec flèche vers la gauche","Enter image caption":"Saisir la légende de l’image","Enter table caption":"Saisir la légende du tableau","Euro sign":"Euro","Euro-currency sign":"Symbole monétaire de l'euro","Exclamation question mark":"Point exclamation et question","Execute the currently focused button":"Exécuter le bouton actuellement ciblé","Font Background Color":"Couleur d'arrière-plan","Font Color":"Couleur de police","Font Family":"Police","Font Size":"Taille de police","For all":"Pour toutLine truncated
!function(e){const t=e.fr=e.fr||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(peut nécessiter <kbd> Fn </kbd> )","%0 of %1":"%0 sur %1",Accept:"Accepter",Accessibility:"Accessibilité","Accessibility help":"Aide à l'accessibilité","Align cell text to the bottom":"Aligner le texte en bas","Align cell text to the center":"Aligner la cellule au centre","Align cell text to the left":"Aligner la cellule à gauche","Align cell text to the middle":"Aligner le texte au milieu","Align cell text to the right":"Aligner la cellule à droite","Align cell text to the top":"Aligner le texte en haut","Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite","Align table to the left":"Aligner le tableau à gauche","Align table to the right":"Aligner le tableau à droite",Alignment:"Alignement",All:"Tous","Almost equal to":"Presque égal à",Angle:"Angle","Approximately equal to":"Environ égal à",Aquamarine:"Bleu vert",Arrows:"Flèches","Asterisk operator":"Astérisque","Austral sign":"Austral","back with leftwards arrow above":"Précédent avec flèche vers la gauche",Background:"Fond","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Ci-dessous, vous trouverez une liste de raccourcis clavier pouvant être utilisés dans l’éditeur.",Big:"Grand","Bitcoin sign":"Bitcoin",Black:"Noir","Block quote":"Citation",Blue:"Bleu","Blue marker":"Marqueur bleu",Bold:"Gras","Bold text":"Texte en gras",Border:"Bordure","Break text":"Saut de ligne","Bulleted List":"Liste à puces","Bulleted list styles toolbar":"Barre d'outils des styles de liste à puce",Cancel:"Annuler","Caption for image: %0":"Légende de l'image : %0","Caption for the image":"Légende de l'image",Category:"Catégorie","Cedi sign":"Cédi","Cell properties":"Propriétés de la cellule","Cent sign":"Centime","Center table":"Centrer le tableau ","Centered image":"Image centrée","Change image text alternative":"Changer le texte alternatif à l’image","Choose heading":"Choisir l'en-tête",Circle:"Cercle",Clear:"Effacer","Click to edit block":"Cliquer pour modifier le bloc",Close:"Fermer","Close contextual balloons, dropdowns, and dialogs":"Fermer les bulles contextuelles, les listes déroulantes et les boîtes de dialogue",Code:"Code","Code block":"Bloc de code","Colon sign":"Deux points",Color:"Couleur","Color picker":"Pipette à couleurs",Column:"Colonne","Contains as member":"Contient","Content editing keystrokes":"Touches d'édition de contenu","Copy selected content":"Copier le contenu sélectionné","Copyright sign":"Copyright","Create link":"Créer un lien","Cruzeiro sign":"Cruzeiro",Currency:"Devise","Currency sign":"Symbole monétaire",Custom:"Personnalisé","Custom image size":"Taille d'image personnalisée",Dashed:"Tirets",Decimal:"Chiffres","Decimal with leading zero":"Chiffres avec des zéros supplémentaire","Decrease indent":"Diminuer le retrait","Decrease list item indent":"Diminuer le retrait des éléments de liste",Default:"Par défaut","Degree sign":"Degré","Delete column":"Supprimer la colonne","Delete row":"Supprimer la ligne","Dim grey":"Gris pâle",Dimensions:"Dimensions",Disc:"Disque","Division sign":"Division","Document colors":"Couleurs du document","Dollar sign":"Dollar","Dong sign":"Dong",Dotted:"Pointillés",Double:"Double","Double dagger":"Croix de Lorraine","Double exclamation mark":"Double point d'exclamation","Double low-9 quotation mark":"Guillemet-virgule double inférieur","Double question mark":"Double point d'interrogation",Downloadable:"Fichier téléchargeable","downwards arrow to bar":"Flèche vers le bas avec barre de fin","downwards dashed arrow":"Flèche en pointillés vers le bas","downwards double arrow":"Double flèche vers le bas","downwards simple arrow":"flèche simple vers le bas","Drachma sign":"Drachme","Drag to move":"Faire glisser pour déplacer","Dropdown menu":"Menu déroulant","Dropdown toolbar":"Barre d'outils dans un menu déroulant","Edit block":"Modifier le bloc","Edit link":"Modifier le lien","Edit source":"Modifier la source","Editor block content toolbar":"Barre d'outils du contenu du bloc éditeur","Editor contextual toolbar":"Barre d'outils contextuelle de l'éditeur","Editor dialog":"Boîte de dialogue de l'éditeur","Editor menu bar":"Barre de menu de l'éditeur","Editor toolbar":"Barre d'outils de l'éditeur","Element of":"Appartient à","Em dash":"Tiret long","Empty set":"Élément vide","Empty snippet content":"Aucun contenu pour ce fragment de code","En dash":"Tiret","end with leftwards arrow above":"Fin avec flèche vers la gauche","Enter image caption":"Saisir la légende de l’image","Enter table caption":"Saisir la légende du tableau","Entering %0 code snippet":"Saisie d'un extrait de code %0","Entering a to-do list":"Saisie d'une liste de tâches","Entering code snippet":"Saisie d'un extrait de code","Error during image upload":"Une erreur s'est produite lors du téléchargement de Line truncated
@@ -1 +1 @@
(function(a){const e=a["gl"]=a["gl"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 de %1",Accept:"Aceptar","Accessibility help":"","Align cell text to the bottom":"Aliñar o texto da cela á base","Align cell text to the center":"Aliñar o texto da cela ao centro","Align cell text to the left":"Aliñar o texto da cela á esquerda","Align cell text to the middle":"Aliñar o texto da cela ao medio","Align cell text to the right":"Aliña o texto da cela á dereita","Align cell text to the top":"Aliñar o texto da cela á parte superior","Align center":"Centrar horizontalmente","Align left":"Aliñar á esquerda","Align right":"Aliñar á dereita","Align table to the left":"Aliñar a táboa á esquerda","Align table to the right":"Aliñar a táboa á dereita",Alignment:"Aliñamento",All:"Todos","Almost equal to":"Case igual a",Angle:"Ángulo","Approximately equal to":"Aproximadamente igual a",Aquamarine:"Augamariña",Arrows:"Frechas","Asterisk operator":"Operador asterisco","Austral sign":"Símbolo do austral","back with leftwards arrow above":"cara atrás, coa frecha cara a esquerda enriba",Background:"Fondo","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Grande","Bitcoin sign":"Símbolo do Bitcoin",Black:"Negro","Block quote":"Cita de bloque",Blue:"Azul","Blue marker":"Marcador azul",Bold:"Negra","Bold text":"",Border:"Bordo","Break text":"Romper o texto","Bulleted List":"Lista con viñetas","Bulleted list styles toolbar":"Barra de ferramentas de estilos de lista con viñetas",Cancel:"Cancelar","Caption for image: %0":"Lenda da imaxe: %0","Caption for the image":"Lenda da imaxe","Cedi sign":"Símbolo do cedi","Cell properties":"Propiedades da cela","Cent sign":"Símbolo do centavo","Center table":"Centrar a táboa","Centered image":"Imaxe centrada horizontalmente","Change image text alternative":"Cambiar o texto alternativo da imaxe","Character categories":"Categorías de caracteres","Choose heading":"Escolla o título",Circle:"Círculos",Clear:"Limpar","Click to edit block":"Prema para editar o bloque",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Código","Colon sign":"Símbolo do colón",Color:"Cor","Color picker":"Selector de cores",Column:"Columna","Contains as member":"Conten a","Content editing keystrokes":"","Copyright sign":"Símbolo de copyright","Create link":"","Cruzeiro sign":"Símbolo do cruceiro",Currency:"Moedas","Currency sign":"Símbolo de moeda",Dashed:"Raiado",Decimal:"Decimais","Decimal with leading zero":"Decimais con cero á esquerda","Decrease indent":"Reducir a sangría","Decrease list item indent":"",Default:"Predeterminada","Degree sign":"Signo de grao","Delete column":"Eliminar columna","Delete row":"Eliminar fila","Dim grey":"Gris fume",Dimensions:"Dimensións",Disc:"Discos","Division sign":"Signo de división","Document colors":"Cores do documento","Dollar sign":"Símbolo do dolar","Dong sign":"Símbolo do dong",Dotted:"Punteado",Double:"Dobre","Double dagger":"Daga dobre","Double exclamation mark":"Marca de dobre exclamación","Double low-9 quotation mark":"Marca de acoutamento comiña dobre baixo-9","Double question mark":"Marca de dobre interrogación",Downloadable:"Descargábel","downwards arrow to bar":"frecha cara abaixo con tope","downwards dashed arrow":"frecha de guións cara abaixo","downwards double arrow":"frecha dobre cara abaixo","downwards simple arrow":"frecha simple cara abaixo","Drachma sign":"Símbolo do dracma","Drag to move":"Arrastre para mover","Dropdown toolbar":"Barra de ferramentas despregábel","Edit block":"Editar bloque","Edit link":"Editar a ligazón","Edit source":"Editar fonte","Editor block content toolbar":"Barra de ferramentas de contido do bloque do editor","Editor contextual toolbar":"Barra de ferramentas contextual do editor","Editor dialog":"","Editor editing area: %0":"Área de edición do editor: %0","Editor toolbar":"Barra de ferramentas do editor","Element of":"Pertenza","Em dash":"Guión longo (raia)","Empty set":"Conxunto baleiro","Empty snippet content":"Contido de fragmento de código baleiro","En dash":"Guión curto","end with leftwards arrow above":"final, coa frecha cara a esquerda enriba","Enter image caption":"Introduza o título da imaxe","Enter table caption":"Introduza o título da táboa","Euro sign":"Símbolo do euro","Euro-currency sign":"Símbolo da moeda do euro","Exclamation question mark":"Marca de exclamación interrogación","Execute the currently focused button":"","Font Background Color":"Cor do fondo da letra","Font Color":"Cor da letra","Font Family":"Familia tipográfica","Font Size":"Tamaño da letra","For all":"Para todo","Fraction slash":"Barra de fracción","French franc sign":"Símbolo do franco francés","Full size image":"Imaxe a tamaño completo","German penny sign":"Símbolo do penique alemán","Greater-than or equal to":"Maior ou igual que","Greater-than sign":"Maior que",Green:"Verde"Line truncated
!function(a){const e=a.gl=a.gl||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(pode ser necesaria <kbd>Fn</kbd>)","%0 of %1":"%0 de %1",Accept:"Aceptar",Accessibility:"Accesibilidade","Accessibility help":"Axuda de accesibilidade","Align cell text to the bottom":"Aliñar o texto da cela á base","Align cell text to the center":"Aliñar o texto da cela ao centro","Align cell text to the left":"Aliñar o texto da cela á esquerda","Align cell text to the middle":"Aliñar o texto da cela ao medio","Align cell text to the right":"Aliña o texto da cela á dereita","Align cell text to the top":"Aliñar o texto da cela á parte superior","Align center":"Centrar horizontalmente","Align left":"Aliñar á esquerda","Align right":"Aliñar á dereita","Align table to the left":"Aliñar a táboa á esquerda","Align table to the right":"Aliñar a táboa á dereita",Alignment:"Aliñamento",All:"Todos","Almost equal to":"Case igual a",Angle:"Ángulo","Approximately equal to":"Aproximadamente igual a",Aquamarine:"Augamariña",Arrows:"Frechas","Asterisk operator":"Operador asterisco","Austral sign":"Símbolo do austral","back with leftwards arrow above":"cara atrás, coa frecha cara a esquerda enriba",Background:"Fondo","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"A continuación, pode atopar unha lista de atallos de teclado que se poden usar no editor.",Big:"Grande","Bitcoin sign":"Símbolo do Bitcoin",Black:"Negro","Block quote":"Cita de bloque",Blue:"Azul","Blue marker":"Marcador azul",Bold:"Grosa","Bold text":"Texto en grosa",Border:"Bordo","Break text":"Romper o texto","Bulleted List":"Lista con viñetas","Bulleted list styles toolbar":"Barra de ferramentas de estilos de lista con viñetas",Cancel:"Cancelar","Caption for image: %0":"Lenda da imaxe: %0","Caption for the image":"Lenda da imaxe",Category:"Categoría","Cedi sign":"Símbolo do cedi","Cell properties":"Propiedades da cela","Cent sign":"Símbolo do centavo","Center table":"Centrar a táboa","Centered image":"Imaxe centrada horizontalmente","Change image text alternative":"Cambiar o texto alternativo da imaxe","Choose heading":"Escolla o título",Circle:"Círculos",Clear:"Limpar","Click to edit block":"Prema para editar o bloque",Close:"Pechar","Close contextual balloons, dropdowns, and dialogs":"Pechar os bocadillos contextuais, menús despregábeis e diálogos",Code:"Código","Code block":"Bloque de código ","Colon sign":"Símbolo do colón",Color:"Cor","Color picker":"Selector de cores",Column:"Columna","Contains as member":"Conten a","Content editing keystrokes":"Teclas de atallo de edición de contido","Copy selected content":"Copiar o contido seleccionado","Copyright sign":"Símbolo de copyright","Create link":"Crear ligazón","Cruzeiro sign":"Símbolo do cruceiro",Currency:"Moedas","Currency sign":"Símbolo de moeda",Custom:"Personalizado","Custom image size":"Tamaño de imaxe personalizado",Dashed:"Raiado",Decimal:"Decimais","Decimal with leading zero":"Decimais con cero á esquerda","Decrease indent":"Reducir a sangría","Decrease list item indent":"Diminuir a sangría do elemento da lista",Default:"Predeterminada","Degree sign":"Signo de grao","Delete column":"Eliminar columna","Delete row":"Eliminar fila","Dim grey":"Gris fume",Dimensions:"Dimensións",Disc:"Discos","Division sign":"Signo de división","Document colors":"Cores do documento","Dollar sign":"Símbolo do dolar","Dong sign":"Símbolo do dong",Dotted:"Punteado",Double:"Dobre","Double dagger":"Daga dobre","Double exclamation mark":"Marca de dobre exclamación","Double low-9 quotation mark":"Marca de acoutamento comiña dobre baixo-9","Double question mark":"Marca de dobre interrogación",Downloadable:"Descargábel","downwards arrow to bar":"frecha cara abaixo con tope","downwards dashed arrow":"frecha de guións cara abaixo","downwards double arrow":"frecha dobre cara abaixo","downwards simple arrow":"frecha simple cara abaixo","Drachma sign":"Símbolo do dracma","Drag to move":"Arrastre para mover","Dropdown menu":"Menú despregábel","Dropdown toolbar":"Barra de ferramentas despregábel","Edit block":"Editar bloque","Edit link":"Editar a ligazón","Edit source":"Editar a orixe","Editor block content toolbar":"Barra de ferramentas de contido do bloque do editor","Editor contextual toolbar":"Barra de ferramentas contextual do editor","Editor dialog":"Diálogo do editor","Editor menu bar":"Barra de menú do editor","Editor toolbar":"Barra de ferramentas do editor","Element of":"Pertenza","Em dash":"Guión longo (raia)","Empty set":"Conxunto baleiro","Empty snippet content":"Contido de fragmento de código baleiro","En dash":"Guión curto","end with leftwards arrow above":"final, coa frecha cara a esquerda enriba","Enter image caption":"Introduza o título da imaxe","Enter table caption":"Introduza o título da táboa","Entering %0 code snippet":"Introducindo o fragmento de código %0","Entering a to-do list":"IntroducLine truncated
@@ -1 +1 @@
(function(e){const t=e["gu"]=e["gu"]||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"","Block quote":" વિચાર ટાંકો",Bold:"ઘાટુ - બોલ્ડ્","Bold text":"",Cancel:"",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Content editing keystrokes":"","Execute the currently focused button":"",Italic:"ત્રાંસુ - ઇટલિક્","Italic text":"","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","Open the accessibility help dialog":"","Remove color":"","Restore default":"",Save:"","Show more items":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"","These keyboard shortcuts allow for quick access to content editing features.":"","Toggle caption off":"","Toggle caption on":"",Underline:"નીચે લિટી - અન્ડરલાઇન્","Underline text":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":""});t.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
!function(t){const e=t.gu=t.gu||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"","Align left":"","Align right":"","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":" વિચાર ટાંકો",Blue:"","Blue marker":"",Bold:"ઘાટુ - બોલ્ડ્","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"","Font Color":"","Font Family":"","Font Size":"","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"","Heading 1":"","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code>&lt;br&gt;</code> element)":"","Insert code block":"","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"ત્રાંસુ - ઇટલિક્","Italic text":"",Justify:"","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Kip sign":"",Latin:"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin cLine truncated
@@ -1 +1 @@
(function(t){const e=t["he"]=t["he"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(עשוי לדרוש <kbd>Fn</kbd>)","%0 of %1":"%0 מתוך %1",Accept:"קבל","Accessibility help":"עזרה בנושא נגישות","Align cell text to the bottom":"יישר את טקסט התא לחלק התחתון","Align cell text to the center":"יישר את טקסט התא למרכז","Align cell text to the left":"יישר את טקסט התא לשמאל","Align cell text to the middle":"יישר את טקסט התא לאמצע","Align cell text to the right":"יישר את טקסט התא לימין","Align cell text to the top":"יישר את טקסט התא לחלק העליון","Align center":"יישור באמצע","Align left":"יישור לשמאל","Align right":"יישור לימין","Align table to the left":"יישור טבלה לשמאל","Align table to the right":"יישור טבלה לימין",Alignment:"יישור",All:"כל","Almost equal to":"כמעט שווה ל-",Angle:"זווית","Approximately equal to":"שווה בקירוב ל-",Aquamarine:"ירוק-כחלחל",Arrows:"חיצים","Asterisk operator":"אופרטור כוכבית","Austral sign":"סמל אאוסטרל","back with leftwards arrow above":'"back" ומעליו חץ שמאלה',Background:"רקע","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"להלן, תוכלו למצוא רשימה של קיצורי מקשים בהם ניתן להשתמש בעורך.",Big:"גדול","Bitcoin sign":"סמל ביטקוין",Black:"שחור","Block quote":"בלוק ציטוט",Blue:"כחול","Blue marker":"סימון כחול",Bold:"מודגש","Bold text":"טקסט מודגש",Border:"גבול","Break text":"שבירת טקסט","Bulleted List":"רשימה מנוקדת","Bulleted list styles toolbar":"סרגל כלים של סגנונות רשימה עם תבליטים",Cancel:"ביטול","Caption for image: %0":"כותרת עבור תמונה: %0","Caption for the image":"כותרת עבור התמונה","Cedi sign":"סמל סדי","Cell properties":"אפשרויות תא","Cent sign":"סמל סנט","Center table":"מירכוז טבלה","Centered image":"תמונה ממרוכזת","Change image text alternative":"שינוי טקסט אלטרנטיבי לתמונה","Character categories":"קטגוריות תווים","Choose heading":"בחר סוג כותרת",Circle:"עיגול",Clear:"לנקות","Click to edit block":"להקיש לעריכת בלוק",Close:"סגור","Close contextual balloons, dropdowns, and dialogs":"סגירת בלוני הקשר, תפריטים נפתחים ותיבות דו-שיח",Code:"קוד","Colon sign":"סמל קולון",Color:"צבע","Color picker":"בורר הצבעים",Column:"עמודה","Contains as member":"מכיל כחבר","Content editing keystrokes":"מקשי עריכת תוכן","Copy selected content":"העתקת התוכן שנבחר","Copyright sign":"סימן זכויות יוצרים","Create link":"יצירת קישור","Cruzeiro sign":"סמל קרוזיירו",Currency:"מטבע","Currency sign":"סמל מטבע",Dashed:"מקווקו",Decimal:"עשרונית","Decimal with leading zero":"עשרונית עם אפס מוביל","Decrease indent":"הקטנת הזחה","Decrease list item indent":"הקטנת הזחה של פריט רשימה",Default:"ברירת מחדל","Degree sign":"סימן מעלה","Delete column":"מחיקת עמודה","Delete row":"מחיקת שורה","Dim grey":"אפור עמום",Dimensions:"ממדים",Disc:"עיגול מלא","Division sign":"סימן חילוק","Document colors":"צבעי המסמך","Dollar sign":"סמל דולר","Dong sign":"סמל דונג",Dotted:"מנוקד",Double:"כפול","Double dagger":"דקר כפול","Double exclamation mark":"סימן קריאה כפול","Double low-9 quotation mark":"מירכאות נמוכות כפולות בצורת 9","Double question mark":"סימן שאלה כפול",Downloadable:"ניתן להורדה","downwards arrow to bar":"חץ למטה לפס","downwards dashed arrow":"חץ מקווקו למטה","downwards double arrow":"חץ כפול למטה","downwards simple arrow":"חץ פשוט כלפי מטה","Drachma sign":"סמל דרכמה","Drag to move":"לגרור כדי להזיז","Dropdown toolbar":"סרגל כלים נפתח","Edit block":"הגדרות בלוק","Edit link":"עריכת קישור","Edit source":"ערוך מקור","Editor block content toolbar":"סרגל כלים של תוכן בלוק של העורך","Editor contextual toolbar":"סרגל כלים הקשרי של העורך","Editor dialog":"חלון דו-שיח של העורך","Editor editing area: %0":"אזור עריכה של העורך: %0","Editor toolbar":"סרגל הכלים","Element of":"שייך ל-","Em dash":"קו מפריד ארוך","Empty set":"הקבוצה הריקה","Empty snippet content":"תוכן קטע ריק","En dash":"קוLine truncated
!function(t){const e=t.he=t.he||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(עשוי לדרוש <kbd>Fn</kbd>)","%0 of %1":"%0 מתוך %1",Accept:"קבל",Accessibility:"נגישות","Accessibility help":"עזרה בנושא נגישות","Align cell text to the bottom":"יישר את טקסט התא לחלק התחתון","Align cell text to the center":"יישר את טקסט התא למרכז","Align cell text to the left":"יישר את טקסט התא לשמאל","Align cell text to the middle":"יישר את טקסט התא לאמצע","Align cell text to the right":"יישר את טקסט התא לימין","Align cell text to the top":"יישר את טקסט התא לחלק העליון","Align center":"יישור באמצע","Align left":"יישור לשמאל","Align right":"יישור לימין","Align table to the left":"יישור טבלה לשמאל","Align table to the right":"יישור טבלה לימין",Alignment:"יישור",All:"כל","Almost equal to":"כמעט שווה ל-",Angle:"זווית","Approximately equal to":"שווה בקירוב ל-",Aquamarine:"ירוק-כחלחל",Arrows:"חיצים","Asterisk operator":"אופרטור כוכבית","Austral sign":"סמל אאוסטרל","back with leftwards arrow above":'"back" ומעליו חץ שמאלה',Background:"רקע","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"להלן, תוכלו למצוא רשימה של קיצורי מקשים בהם ניתן להשתמש בעורך.",Big:"גדול","Bitcoin sign":"סמל ביטקוין",Black:"שחור","Block quote":"בלוק ציטוט",Blue:"כחול","Blue marker":"סימון כחול",Bold:"מודגש","Bold text":"טקסט מודגש",Border:"גבול","Break text":"שבירת טקסט","Bulleted List":"רשימה מנוקדת","Bulleted list styles toolbar":"סרגל כלים של סגנונות רשימה עם תבליטים",Cancel:"ביטול","Caption for image: %0":"כותרת עבור תמונה: %0","Caption for the image":"כותרת עבור התמונה",Category:"קטגוריה","Cedi sign":"סמל סדי","Cell properties":"אפשרויות תא","Cent sign":"סמל סנט","Center table":"מירכוז טבלה","Centered image":"תמונה ממרוכזת","Change image text alternative":"שינוי טקסט אלטרנטיבי לתמונה","Choose heading":"בחר סוג כותרת",Circle:"עיגול",Clear:"לנקות","Click to edit block":"להקיש לעריכת בלוק",Close:"סגור","Close contextual balloons, dropdowns, and dialogs":"סגירת בלוני הקשר, תפריטים נפתחים ותיבות דו-שיח",Code:"קוד","Code block":"בלוק קוד","Colon sign":"סמל קולון",Color:"צבע","Color picker":"בורר הצבעים",Column:"עמודה","Contains as member":"מכיל כחבר","Content editing keystrokes":"מקשי עריכת תוכן","Copy selected content":"העתקת התוכן שנבחר","Copyright sign":"סימן זכויות יוצרים","Create link":"יצירת קישור","Cruzeiro sign":"סמל קרוזיירו",Currency:"מטבע","Currency sign":"סמל מטבע",Custom:"מותאם אישית","Custom image size":"גודל תמונה מותאם אישית",Dashed:"מקווקו",Decimal:"עשרונית","Decimal with leading zero":"עשרונית עם אפס מוביל","Decrease indent":"הקטנת הזחה","Decrease list item indent":"הקטנת הזחה של פריט רשימה",Default:"ברירת מחדל","Degree sign":"סימן מעלה","Delete column":"מחיקת עמודה","Delete row":"מחיקת שורה","Dim grey":"אפור עמום",Dimensions:"ממדים",Disc:"עיגול מלא","Division sign":"סימן חילוק","Document colors":"צבעי המסמך","Dollar sign":"סמל דולר","Dong sign":"סמל דונג",Dotted:"מנוקד",Double:"כפול","Double dagger":"דקר כפול","Double exclamation mark":"סימן קריאה כפול","Double low-9 quotation mark":"מירכאות נמוכות כפולות בצורת 9","Double question mark":"סימן שאלה כפול",Downloadable:"ניתן להורדה","downwards arrow to bar":"חץ למטה לפס","downwards dashed arrow":"חץ מקווקו למטה","downwards double arrow":"חץ כפול למטה","downwards simple arrow":"חץ פשוט כלפי מטה","Drachma sign":"סמל דרכמה","Drag to move":"לגרור כדי להזיז","Dropdown menu":"תפריט נפתח","Dropdown toolbar":"סרגל כלים נפתח","Edit block":"הגדרות בלוק","Edit link":"עריכת קישור","Edit source":"ערוך מקור","Editor block content toolbar":"סרגל כלים של תוכן בלוק של העורך","Editor contextual toolbar":"סרגל כלים הקשרי של העורך","Editor dialog":"חלון דו-שיח של העורך","Editor menu bar":"שורת התפריטים של העורך","Editor toolbar":"סרגל הכלים","Element of":Line truncated
@@ -1 +1 @@
(function(t){const e=t["hi"]=t["hi"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(इसके लिए <kbd>Fn</kbd> की ज़रूरत हो सकती है)","%0 of %1":"%0 of %1",Accept:"स्वीकार करें","Accessibility help":"एक्सेसिबिलिटी हेल्प","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"सभी","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"एरोज","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"नीचे, आप उन कीबोर्ड शॉर्टकट्स की एक लिस्ट देख सकते हैं जिनका इस्तेमाल एडिटर में किया जा सकता है.",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"टेक्स्ट को बोल्ड करें",Border:"Border","Break text":"टेक्स्ट तोड़ें","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"छवि के लिए कैप्शन: %0","Caption for the image":"छवि के लिए कैप्शन","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Center table","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Character categories":"Character categories","Choose heading":"Choose heading",Circle:"Circle",Clear:"साफ़ करें","Click to edit block":"ब्लॉक एडिट करने के लिए क्लिक करें",Close:"बंद करें","Close contextual balloons, dropdowns, and dialogs":"कॉन्टेक्सचुअल बलून्स, ड्रॉपडाउन्स और डायलॉग्स को बंद करें",Code:"Code","Colon sign":"Colon sign",Color:"Color","Color picker":"Color picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"कॉन्टेंट एडिटिंग कीस्ट्रोक्स","Copy selected content":"सेलेक्ट किए गए कॉन्टेंट को कॉपी करें","Copyright sign":"Copyright sign","Create link":"लिंक बनाएँ","Cruzeiro sign":"Cruzeiro sign",Currency:"करेंसी","Currency sign":"Currency sign",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"लिस्ट आइटम इंडेंट को घटाएँ",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colors","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"सिम्पल ऐरो नीचे की तरफ","Drachma sign":"Drachma sign","Drag to move":"मूव करने के लिए ड्रैग करें","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"सोर्स एडिट करें","Editor block content toolbar":"एडीटर ब्लॉक कंटेंट टूलबार","Editor contextual toolbar":"एडीटर कॉन्टेक्स्टूअल टूलबार","Editor dialog":"एडिटर डायलॉग","Editor editing area: %0":"संपादक संपादन क्षेत्र: %0","Editor toolbar"Line truncated
!function(t){const e=t.hi=t.hi||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(इसके लिए <kbd>Fn</kbd> की ज़रूरत हो सकती है)","%0 of %1":"%0 of %1",Accept:"स्वीकार करें",Accessibility:"पहुँच","Accessibility help":"एक्सेसिबिलिटी हेल्प","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"सभी","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"एरोज","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"नीचे, आप उन कीबोर्ड शॉर्टकट्स की एक लिस्ट देख सकते हैं जिनका इस्तेमाल एडिटर में किया जा सकता है.",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"टेक्स्ट को बोल्ड करें",Border:"Border","Break text":"टेक्स्ट तोड़ें","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"छवि के लिए कैप्शन: %0","Caption for the image":"छवि के लिए कैप्शन",Category:"केटेगरी","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Center table","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"Circle",Clear:"साफ़ करें","Click to edit block":"ब्लॉक एडिट करने के लिए क्लिक करें",Close:"बंद करें","Close contextual balloons, dropdowns, and dialogs":"कॉन्टेक्सचुअल बलून्स, ड्रॉपडाउन्स और डायलॉग्स को बंद करें",Code:"Code","Code block":"कोड ब्लॉक","Colon sign":"Colon sign",Color:"Color","Color picker":"Color picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"कॉन्टेंट एडिटिंग कीस्ट्रोक्स","Copy selected content":"सेलेक्ट किए गए कॉन्टेंट को कॉपी करें","Copyright sign":"Copyright sign","Create link":"लिंक बनाएँ","Cruzeiro sign":"Cruzeiro sign",Currency:"करेंसी","Currency sign":"Currency sign",Custom:"कस्टम","Custom image size":"तस्वीर का कस्टम साइज़",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"लिस्ट आइटम इंडेंट को घटाएँ",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colors","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"सिम्पल ऐरो नीचे की तरफ","Drachma sign":"Drachma sign","Drag to move":"मूव करने के लिए ड्रैग करें","Dropdown menu":"ड्रापडाउन मेन्यू","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"सोर्स एडिट करें","Editor block content toolbar":"एडीटर ब्लॉक कंटेंट टूलबार","Editor contextual toolbar":"एडीटर कLine truncated
Loaded 100 of 149 files, more files were not shown because too many files have changed in this diff. Show more