Compare commits
28
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0b4a05c70 | ||
|
|
95d6911f1a | ||
|
|
48f98ef34e | ||
|
|
ae0c5eae77 | ||
|
|
0c2d727057 | ||
|
|
072f5f5a15 | ||
|
|
1db85743a0 | ||
|
|
2cf66e037d | ||
|
|
449d838dc2 | ||
|
|
c4bc215a47 | ||
|
|
c9936d7ecf | ||
|
|
885e59a2af | ||
|
|
bf398889bf | ||
|
|
e26e3d7307 | ||
|
|
045b275b27 | ||
|
|
7ec1973e0f | ||
|
|
a79a9c4eff | ||
|
|
f049e2430a | ||
|
|
59b3219f2d | ||
|
|
e9eb8bdc86 | ||
|
|
5e0c7ae4f2 | ||
|
|
c1c0c1ab44 | ||
|
|
a59fff785b | ||
|
|
6a70db80e6 | ||
|
|
d610630c8d | ||
|
|
4dc7790015 | ||
|
|
9dd000a2ca | ||
|
|
ce4084e528 |
No files matched your search
+11
-28
@@ -1,33 +1,16 @@
|
||||
config.make
|
||||
tags
|
||||
*._*
|
||||
*.css
|
||||
*.pyc
|
||||
*.sax
|
||||
*.swp
|
||||
*.wox/
|
||||
*/*/*.SOGo/
|
||||
*/*/*/obj/
|
||||
*/*/obj/
|
||||
*/obj/
|
||||
.scss-lint-config.yml_
|
||||
Documentation/*.docbook
|
||||
Documentation/*.pdf
|
||||
*._*
|
||||
*/*/obj/
|
||||
*/*/*/obj/
|
||||
*/*/*.SOGo/
|
||||
*.sax
|
||||
*.wox/
|
||||
*.swp
|
||||
SoObjects/SOGo/SOGo.framework/
|
||||
SoObjects/SOGo/derived_src/
|
||||
Tests/*/config.py
|
||||
UI/WebServerResources/.bowerrc
|
||||
UI/WebServerResources/.sass-cache/
|
||||
UI/WebServerResources/bower_components/
|
||||
UI/WebServerResources/css/
|
||||
UI/WebServerResources/css/styles.css
|
||||
UI/WebServerResources/css/styles.css.map
|
||||
UI/WebServerResources/js/Common.js*
|
||||
UI/WebServerResources/js/Contacts.js*
|
||||
UI/WebServerResources/js/Mailer.js*
|
||||
UI/WebServerResources/js/Preferences.js*
|
||||
UI/WebServerResources/js/Scheduler.js*
|
||||
UI/WebServerResources/js/vendor/
|
||||
UI/WebServerResources/node_modules/
|
||||
UI/WebServerResources/scss/.sass-cache/
|
||||
config.make
|
||||
doc
|
||||
tags
|
||||
*.pyc
|
||||
._*
|
||||
@@ -1,3 +0,0 @@
|
||||
[submodule "UI/WebServerResources/angular-material"]
|
||||
path = UI/WebServerResources/angular-material
|
||||
url = https://github.com/angular/material
|
||||
-33
@@ -12,7 +12,6 @@ trans.da_DK = UI/MailerUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MailerUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MailerUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MailerUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/MailerUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/MailerUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MailerUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
|
||||
@@ -25,10 +24,8 @@ trans.pl = UI/MailerUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/MailerUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailerUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MailerUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-preferencesui]
|
||||
source_file = UI/PreferencesUI/English.lproj/Localizable.strings
|
||||
@@ -41,7 +38,6 @@ trans.da_DK = UI/PreferencesUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/PreferencesUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/PreferencesUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/PreferencesUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/PreferencesUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
|
||||
@@ -54,10 +50,8 @@ trans.pl = UI/PreferencesUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/PreferencesUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/PreferencesUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/PreferencesUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-scheduler]
|
||||
source_file = UI/Scheduler/English.lproj/Localizable.strings
|
||||
@@ -70,7 +64,6 @@ trans.da_DK = UI/Scheduler/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Scheduler/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Scheduler/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Scheduler/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/Scheduler/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/Scheduler/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Scheduler/French.lproj/Localizable.strings
|
||||
trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
|
||||
@@ -83,10 +76,8 @@ trans.pl = UI/Scheduler/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/Scheduler/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Scheduler/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Scheduler/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-contacts]
|
||||
source_file = UI/Contacts/English.lproj/Localizable.strings
|
||||
@@ -99,7 +90,6 @@ trans.da_DK = UI/Contacts/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Contacts/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Contacts/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Contacts/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/Contacts/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/Contacts/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Contacts/French.lproj/Localizable.strings
|
||||
trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
|
||||
@@ -112,10 +102,8 @@ trans.pl = UI/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Contacts/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mainui]
|
||||
source_file = UI/MainUI/English.lproj/Localizable.strings
|
||||
@@ -128,7 +116,6 @@ trans.da_DK = UI/MainUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MainUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MainUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MainUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/MainUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/MainUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MainUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
|
||||
@@ -141,10 +128,8 @@ trans.pl = UI/MainUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/MainUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MainUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MainUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-common]
|
||||
source_file = UI/Common/English.lproj/Localizable.strings
|
||||
@@ -157,7 +142,6 @@ trans.da_DK = UI/Common/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/Common/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/Common/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/Common/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/Common/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/Common/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/Common/French.lproj/Localizable.strings
|
||||
trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
|
||||
@@ -170,10 +154,8 @@ trans.pl = UI/Common/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/Common/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/Common/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/Common/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/Common/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/Common/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-administrationui]
|
||||
source_file = UI/AdministrationUI/English.lproj/Localizable.strings
|
||||
@@ -186,7 +168,6 @@ trans.da_DK = UI/AdministrationUI/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/AdministrationUI/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/AdministrationUI/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/AdministrationUI/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/AdministrationUI/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/AdministrationUI/French.lproj/Localizable.strings
|
||||
trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
|
||||
@@ -199,10 +180,8 @@ trans.pl = UI/AdministrationUI/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/AdministrationUI/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/AdministrationUI/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/AdministrationUI/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/AdministrationUI/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-appointments]
|
||||
source_file = SoObjects/Appointments/English.lproj/Localizable.strings
|
||||
@@ -215,7 +194,6 @@ trans.da_DK = SoObjects/Appointments/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Appointments/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Appointments/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = SoObjects/Appointments/Basque.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Appointments/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Appointments/French.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
|
||||
@@ -228,10 +206,8 @@ trans.pl = SoObjects/Appointments/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Appointments/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Appointments/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Appointments/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-contacts]
|
||||
source_file = SoObjects/Contacts/English.lproj/Localizable.strings
|
||||
@@ -244,7 +220,6 @@ trans.da_DK = SoObjects/Contacts/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Contacts/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Contacts/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Contacts/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = SoObjects/Contacts/Basque.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Contacts/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Contacts/French.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
|
||||
@@ -257,10 +232,8 @@ trans.pl = SoObjects/Contacts/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Contacts/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Contacts/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Contacts/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Contacts/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.soobjects-mailer]
|
||||
source_file = SoObjects/Mailer/English.lproj/Localizable.strings
|
||||
@@ -273,7 +246,6 @@ trans.da_DK = SoObjects/Mailer/Danish.lproj/Localizable.strings
|
||||
trans.de = SoObjects/Mailer/German.lproj/Localizable.strings
|
||||
trans.es_AR = SoObjects/Mailer/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = SoObjects/Mailer/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = SoObjects/Mailer/Basque.lproj/Localizable.strings
|
||||
trans.fi = SoObjects/Mailer/Finnish.lproj/Localizable.strings
|
||||
trans.fr = SoObjects/Mailer/French.lproj/Localizable.strings
|
||||
trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings
|
||||
@@ -286,10 +258,8 @@ trans.pl = SoObjects/Mailer/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = SoObjects/Mailer/Russian.lproj/Localizable.strings
|
||||
trans.sk = SoObjects/Mailer/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = SoObjects/Mailer/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = SoObjects/Mailer/Swedish.lproj/Localizable.strings
|
||||
trans.uk = SoObjects/Mailer/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = SoObjects/Mailer/ChineseTaiwan.lproj/Localizable.strings
|
||||
|
||||
[sogo.ui-mailpartviewers]
|
||||
source_file = UI/MailPartViewers/English.lproj/Localizable.strings
|
||||
@@ -302,7 +272,6 @@ trans.da_DK = UI/MailPartViewers/Danish.lproj/Localizable.strings
|
||||
trans.de = UI/MailPartViewers/German.lproj/Localizable.strings
|
||||
trans.es_AR = UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings
|
||||
trans.es_ES = UI/MailPartViewers/SpanishSpain.lproj/Localizable.strings
|
||||
trans.eu = UI/MailPartViewers/Basque.lproj/Localizable.strings
|
||||
trans.fi = UI/MailPartViewers/Finnish.lproj/Localizable.strings
|
||||
trans.fr = UI/MailPartViewers/French.lproj/Localizable.strings
|
||||
trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
|
||||
@@ -315,7 +284,5 @@ trans.pl = UI/MailPartViewers/Polish.lproj/Localizable.strings
|
||||
trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings
|
||||
trans.ru = UI/MailPartViewers/Russian.lproj/Localizable.strings
|
||||
trans.sk = UI/MailPartViewers/Slovak.lproj/Localizable.strings
|
||||
trans.sl_SI = UI/MailPartViewers/Slovenian.lproj/Localizable.strings
|
||||
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
|
||||
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
|
||||
trans.zh_TW = UI/MailPartViewers/ChineseTaiwan.lproj/Localizable.strings
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2015, Inverse inc.
|
||||
Copyright (c) 2014, Inverse inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -33,45 +33,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGMail/NGMailAddress.h>
|
||||
#import <NGMail/NGMailAddressParser.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
|
||||
@implementation NGMimeMessage (ActiveSync)
|
||||
|
||||
- (void) _addRecipients: (NSEnumerator *) enumerator
|
||||
toArray: (NSMutableArray *) recipients
|
||||
{
|
||||
NGMailAddressParser *parser;
|
||||
NSEnumerator *addressList;
|
||||
NGMailAddress *address;
|
||||
NSString *s;
|
||||
|
||||
while ((s = [enumerator nextObject]))
|
||||
{
|
||||
parser = [NGMailAddressParser mailAddressParserWithString: s];
|
||||
addressList = [[parser parseAddressList] objectEnumerator];
|
||||
|
||||
while ((address = [addressList nextObject]))
|
||||
[recipients addObject: [address address]];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSArray *) allRecipients
|
||||
{
|
||||
NSMutableArray *recipients;
|
||||
NSEnumerator *enumerator;
|
||||
NSString *s;
|
||||
|
||||
recipients = [NSMutableArray array];
|
||||
|
||||
[self _addRecipients: [[self headersForKey: @"to"] objectEnumerator]
|
||||
toArray: recipients];
|
||||
enumerator = [[self headersForKey: @"to"] objectEnumerator];
|
||||
while ((s = [enumerator nextObject]))
|
||||
{
|
||||
[recipients addObject: [s pureEMailAddress]];
|
||||
}
|
||||
|
||||
[self _addRecipients: [[self headersForKey: @"cc"] objectEnumerator]
|
||||
toArray: recipients];
|
||||
|
||||
[self _addRecipients: [[self headersForKey: @"bcc"] objectEnumerator]
|
||||
toArray: recipients];
|
||||
enumerator = [[self headersForKey: @"cc"] objectEnumerator];
|
||||
while ((s = [enumerator nextObject]))
|
||||
{
|
||||
[recipients addObject: [s pureEMailAddress]];
|
||||
}
|
||||
|
||||
return recipients;
|
||||
}
|
||||
|
||||
@@ -33,7 +33,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSTimeZone.h>
|
||||
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
|
||||
@@ -41,8 +40,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import <Contacts/NGVCard+SOGo.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
|
||||
#include "NSDate+ActiveSync.h"
|
||||
#include "NSString+ActiveSync.h"
|
||||
|
||||
@@ -194,18 +191,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if ((o = [self note]))
|
||||
{
|
||||
// It is very important here to NOT set <Truncated>0</Truncated> in the response,
|
||||
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
|
||||
o = [o activeSyncRepresentationInContext: context];
|
||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||
[s appendFormat: @"<Type>%d</Type>", 1];
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
|
||||
[s appendFormat: @"<Truncated>%d</Truncated>", 0];
|
||||
[s appendFormat: @"<Data>%@</Data>", o];
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
|
||||
if ((o = [self photo]))
|
||||
[s appendFormat: @"<Picture xmlns=\"Contacts:\">%@</Picture>", o];
|
||||
|
||||
return s;
|
||||
}
|
||||
@@ -224,14 +217,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setNote: o];
|
||||
|
||||
// Categories
|
||||
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
|
||||
if ((o = [theValues objectForKey: @"Categories"]))
|
||||
[self setCategories: o];
|
||||
|
||||
// Birthday
|
||||
if ((o = [theValues objectForKey: @"Birthday"]))
|
||||
{
|
||||
o = [o calendarDate];
|
||||
[self setBday: [o descriptionWithCalendarFormat: @"%Y-%m-%d" timeZone: nil locale: nil]];
|
||||
[self setBday: [o descriptionWithCalendarFormat: @"%Y-%m-%d"]];
|
||||
}
|
||||
|
||||
//
|
||||
@@ -292,13 +285,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if ((o = [theValues objectForKey: @"Email1Address"]))
|
||||
{
|
||||
element = [self elementWithTag: @"email" ofType: @"work"];
|
||||
[element setSingleValue: [o pureEMailAddress] forKey: @""];
|
||||
[element setSingleValue: o forKey: @""];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"Email2Address"]))
|
||||
{
|
||||
element = [self elementWithTag: @"email" ofType: @"home"];
|
||||
[element setSingleValue: [o pureEMailAddress] forKey: @""];
|
||||
[element setSingleValue: o forKey: @""];
|
||||
}
|
||||
|
||||
// SOGo currently only supports 2 email addresses ... but AS clients might send 3
|
||||
@@ -306,7 +299,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
if ((o = [theValues objectForKey: @"Email3Address"]))
|
||||
{
|
||||
element = [self elementWithTag: @"email" ofType: @"three"];
|
||||
[element setSingleValue: [o pureEMailAddress] forKey: @""];
|
||||
[element setSingleValue: o forKey: @""];
|
||||
}
|
||||
|
||||
// Formatted name
|
||||
@@ -353,10 +346,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if ((o = [theValues objectForKey: @"NickName"]))
|
||||
[self setNickname: o];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Picture"]))
|
||||
[self setPhoto: o];
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -32,10 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
|
||||
#import <NGExtensions/NGBase64Coding.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#include <wbxml/wbxml.h>
|
||||
#include <wbxml/wbxml_conv.h>
|
||||
@@ -47,18 +44,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
- (void) _dumpToFile
|
||||
{
|
||||
BOOL debugOn;
|
||||
NSString *path;
|
||||
|
||||
debugOn = [[SOGoSystemDefaults sharedSystemDefaults] easDebugEnabled];
|
||||
|
||||
if (debugOn)
|
||||
{
|
||||
NSString *path;
|
||||
|
||||
path = [NSString stringWithFormat: @"/tmp/%@.data", [[NSProcessInfo processInfo] globallyUniqueString]];
|
||||
[self writeToFile: path atomically: YES];
|
||||
[self errorWithFormat: @"Original data written to: %@", path];
|
||||
}
|
||||
path = [NSString stringWithFormat: @"/tmp/%@.data", [[NSProcessInfo processInfo] globallyUniqueString]];
|
||||
[self writeToFile: path atomically: YES];
|
||||
NSLog(@"Original data written to: %@", path);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -66,33 +56,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
NSString *tmp, *s;
|
||||
unichar *buf, *start, c;
|
||||
int len, i, j;
|
||||
|
||||
tmp = [self stringByEncodingBase64] ;
|
||||
|
||||
len = [tmp length];
|
||||
|
||||
start = buf = (unichar *)malloc(len*sizeof(unichar));
|
||||
[tmp getCharacters: buf range: NSMakeRange(0, len)];
|
||||
|
||||
for (i = 0, j = 0; i < len; i++)
|
||||
{
|
||||
c = *buf;
|
||||
|
||||
if (!(c == 0xA))
|
||||
{
|
||||
*(start+j) = c;
|
||||
j++;
|
||||
}
|
||||
|
||||
buf++;
|
||||
}
|
||||
|
||||
s = [[NSString alloc] initWithCharactersNoCopy: start length: j freeWhenDone: YES];
|
||||
|
||||
return AUTORELEASE(s);
|
||||
return [[self stringByEncodingBase64] stringByReplacingString: @"\n" withString: @""];
|
||||
}
|
||||
|
||||
- (NSData *) wbxml2xml
|
||||
@@ -117,18 +81,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
[self errorWithFormat: @"wbxml2xmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
NSLog(@"wbxml2xmlFromContent: failed: %s\n", wbxml_errors_string(ret));
|
||||
[self _dumpToFile];
|
||||
return nil;
|
||||
}
|
||||
|
||||
data = [NSData dataWithBytesNoCopy: xml length: xml_len freeWhenDone: YES];
|
||||
data = [[NSData alloc] initWithBytes: xml length: xml_len];
|
||||
|
||||
#if WBXMLDEBUG
|
||||
[data writeToFile: @"/tmp/protocol.decoded" atomically: YES];
|
||||
#endif
|
||||
|
||||
return data;
|
||||
free(xml);
|
||||
|
||||
return AUTORELEASE(data);
|
||||
}
|
||||
|
||||
|
||||
@@ -150,7 +116,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
[self logWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
NSLog(@"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret));
|
||||
[self _dumpToFile];
|
||||
return nil;
|
||||
}
|
||||
@@ -165,21 +131,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
[self errorWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
NSLog(@"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret));
|
||||
[self _dumpToFile];
|
||||
free(wbxml);
|
||||
wbxml_conv_xml2wbxml_destroy(conv);
|
||||
return nil;
|
||||
}
|
||||
|
||||
data = [NSData dataWithBytesNoCopy: wbxml length: wbxml_len freeWhenDone: YES];
|
||||
data = [[NSData alloc] initWithBytes: wbxml length: wbxml_len];
|
||||
|
||||
#if WBXMLDEBUG
|
||||
[data writeToFile: @"/tmp/protocol.encoded" atomically: YES];
|
||||
#endif
|
||||
|
||||
free(wbxml);
|
||||
wbxml_conv_xml2wbxml_destroy(conv);
|
||||
|
||||
return data;
|
||||
|
||||
return AUTORELEASE(data);
|
||||
}
|
||||
@end
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2014-2015, Inverse inc.
|
||||
Copyright (c) 2014, Inverse inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -47,11 +47,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- (NSCalendarDate *) calendarDate;
|
||||
- (NSString *) deviceId;
|
||||
- (NSString *) deviceType;
|
||||
- (NSString *) attachmentName;
|
||||
- (NSString *) command;
|
||||
- (NSString *) collectionid;
|
||||
- (NSString *) itemid;
|
||||
- (BOOL) acceptsMultiPart;
|
||||
- (NSData *) convertHexStringToBytes;
|
||||
|
||||
@end
|
||||
|
||||
@@ -33,112 +33,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <Foundation/NSCalendarDate.h>
|
||||
#include <Foundation/NSData.h>
|
||||
#include <Foundation/NSDate.h>
|
||||
#include <Foundation/NSTimeZone.h>
|
||||
|
||||
#include <SOGo/NSString+Utilities.h>
|
||||
#include <SOGo/NSData+Crypto.h>
|
||||
|
||||
#include <NGExtensions/NGBase64Coding.h>
|
||||
#include <NGExtensions/NSString+misc.h>
|
||||
|
||||
static NSArray *easCommandCodes = nil;
|
||||
static NSArray *easCommandParameters = nil;
|
||||
|
||||
@implementation NSString (ActiveSync)
|
||||
|
||||
//
|
||||
// This is a copy from NSString+XMLEscaping.m from SOPE.
|
||||
// The difference here is that we use wchar_t instead of unichar.
|
||||
// This is needed to get the rigth numeric character reference.
|
||||
// e.g. SMILING FACE WITH OPEN MOUTH
|
||||
// ok: wchar_t -> 😃 wrong: unichar -> � �
|
||||
//
|
||||
// We avoir naming it like the one in SOPE since if the ActiveSync
|
||||
// bundle is loaded, it'll overwrite the one provided by SOPE.
|
||||
//
|
||||
- (NSString *) _stringByEscapingXMLStringUsingCharacters {
|
||||
register unsigned i, len, j;
|
||||
register wchar_t *buf;
|
||||
const wchar_t *chars;
|
||||
unsigned escapeCount;
|
||||
|
||||
if ([self length] == 0) return @"";
|
||||
|
||||
NSData *data = [self dataUsingEncoding:NSUTF32StringEncoding];
|
||||
chars = [data bytes];
|
||||
len = [data length]/4;
|
||||
|
||||
/* check for characters to escape ... */
|
||||
for (i = 0, escapeCount = 0; i < len; i++) {
|
||||
switch (chars[i]) {
|
||||
case '&': case '"': case '<': case '>': case '\r':
|
||||
escapeCount++;
|
||||
break;
|
||||
default:
|
||||
if (chars[i] > 127)
|
||||
escapeCount++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (escapeCount == 0 ) {
|
||||
/* nothing to escape ... */
|
||||
return [[self copy] autorelease];
|
||||
}
|
||||
|
||||
buf = calloc((len + 5) + (escapeCount * 16), sizeof(wchar_t));
|
||||
for (i = 0, j = 0; i < len; i++) {
|
||||
switch (chars[i]) {
|
||||
/* escape special chars */
|
||||
case '\r':
|
||||
buf[j] = '&'; j++; buf[j] = '#'; j++; buf[j] = '1'; j++;
|
||||
buf[j] = '3'; j++; buf[j] = ';'; j++;
|
||||
break;
|
||||
case '&':
|
||||
buf[j] = '&'; j++; buf[j] = 'a'; j++; buf[j] = 'm'; j++;
|
||||
buf[j] = 'p'; j++; buf[j] = ';'; j++;
|
||||
break;
|
||||
case '"':
|
||||
buf[j] = '&'; j++; buf[j] = 'q'; j++; buf[j] = 'u'; j++;
|
||||
buf[j] = 'o'; j++; buf[j] = 't'; j++; buf[j] = ';'; j++;
|
||||
break;
|
||||
case '<':
|
||||
buf[j] = '&'; j++; buf[j] = 'l'; j++; buf[j] = 't'; j++;
|
||||
buf[j] = ';'; j++;
|
||||
break;
|
||||
case '>':
|
||||
buf[j] = '&'; j++; buf[j] = 'g'; j++; buf[j] = 't'; j++;
|
||||
buf[j] = ';'; j++;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* escape big chars */
|
||||
if (chars[i] > 127) {
|
||||
unsigned char nbuf[32];
|
||||
unsigned int k;
|
||||
|
||||
sprintf((char *)nbuf, "&#%i;", (int)chars[i]);
|
||||
for (k = 0; nbuf[k] != '\0'; k++) {
|
||||
buf[j] = nbuf[k];
|
||||
j++;
|
||||
}
|
||||
}
|
||||
else if (chars[i] == 0x9 || chars[i] == 0xA || chars[i] == 0xD || chars[i] >= 0x20) { // ignore any unsupported control character
|
||||
/* nothing to escape */
|
||||
buf[j] = chars[i];
|
||||
j++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
self = [[NSString alloc] initWithBytesNoCopy: buf
|
||||
length: (j*sizeof(wchar_t))
|
||||
encoding: NSUTF32StringEncoding
|
||||
freeWhenDone: YES];
|
||||
|
||||
return [self autorelease];
|
||||
}
|
||||
|
||||
- (NSString *) sanitizedServerIdWithType: (SOGoMicrosoftActiveSyncFolderType) folderType
|
||||
{
|
||||
if (folderType == ActiveSyncEventFolder)
|
||||
@@ -158,7 +59,12 @@ static NSArray *easCommandParameters = nil;
|
||||
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
return [self _stringByEscapingXMLStringUsingCharacters];
|
||||
NSString *s;
|
||||
|
||||
s = [self stringByEscapingHTMLString];
|
||||
|
||||
return [[s componentsSeparatedByCharactersInSet: [self safeCharacterSet]]
|
||||
componentsJoinedByString: @""];
|
||||
}
|
||||
|
||||
- (int) activeSyncFolderType
|
||||
@@ -217,98 +123,23 @@ static NSArray *easCommandParameters = nil;
|
||||
//
|
||||
- (NSCalendarDate *) calendarDate
|
||||
{
|
||||
NSString *s;
|
||||
id o;
|
||||
|
||||
// We force parsing in the GMT timezone. If we don't do that, the date will be parsed
|
||||
// in the default timezone.
|
||||
s = [NSString stringWithFormat: @"%@ GMT", self];
|
||||
o = [NSCalendarDate dateWithString: s calendarFormat: @"%Y%m%dT%H%M%SZ %Z"];
|
||||
o = [NSCalendarDate dateWithString: self calendarFormat: @"%Y%m%dT%H%M%SZ"];
|
||||
|
||||
if (!o)
|
||||
o = [NSCalendarDate dateWithString: s calendarFormat: @"%Y-%m-%dT%H:%M:%S.%FZ %Z"];
|
||||
|
||||
o = [NSCalendarDate dateWithString: self calendarFormat: @"%Y-%m-%dT%H:%M:%S.%FZ"];
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
- (NSString *) _valueForParameter: (NSString *) theParameter
|
||||
{
|
||||
NSMutableArray *components;
|
||||
NSArray *components;
|
||||
NSString *s;
|
||||
int i;
|
||||
|
||||
components = [NSMutableArray arrayWithArray: [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]];
|
||||
|
||||
// We handle BASE64 encoded queryStrings. See http://msdn.microsoft.com/en-us/library/ee160227%28v=exchg.80%29.aspx for details.
|
||||
if ([components count] == 1)
|
||||
{
|
||||
NSString *deviceType, *parameterValue;
|
||||
NSData *queryString;
|
||||
|
||||
int cmd_code, deviceid_length, policy_length, devicetype_length, parameter_code, parameter_length, i;
|
||||
const char* qs_bytes;
|
||||
|
||||
queryString = [[components objectAtIndex: 0] dataByDecodingBase64];
|
||||
|
||||
if (![queryString length])
|
||||
return nil;
|
||||
|
||||
qs_bytes = (const char*)[queryString bytes];
|
||||
|
||||
if (!easCommandCodes)
|
||||
{
|
||||
easCommandCodes = [NSArray arrayWithObjects:@"Sync", @"SendMail", @"SmartForward", @"SmartReply", @"GetAttachment", @"na", @"na", @"na", @"na",
|
||||
@"FolderSync", @"FolderCreate", @"FolderDelete", @"FolderUpdate", @"MoveItems", @"GetItemEstimate", @"MeetingResponse",
|
||||
@"Search", @"Settings", @"Ping", @"ItemOperations", @"Provision", @"ResolveRecipients", @"ValidateCert", nil];
|
||||
RETAIN(easCommandCodes);
|
||||
}
|
||||
|
||||
if (!easCommandParameters)
|
||||
{
|
||||
easCommandParameters = [NSArray arrayWithObjects:@"AttachmentName", @"CollectionId", @"na", @"ItemId", @"LongId", @"na", @"Occurrence", @"Options", @"User", nil];
|
||||
RETAIN(easCommandParameters);
|
||||
}
|
||||
|
||||
// Command code, 1 byte, ie.: cmd=
|
||||
cmd_code = qs_bytes[1];
|
||||
[components addObject: [NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]];
|
||||
|
||||
// Device ID length and Device ID (variable)
|
||||
deviceid_length = qs_bytes[4];
|
||||
[components addObject: [NSString stringWithFormat: @"deviceId=%@", [[NSData encodeDataAsHexString: [queryString subdataWithRange: NSMakeRange(5, deviceid_length)]] uppercaseString]]];
|
||||
|
||||
// Device type length and type (variable)
|
||||
policy_length = qs_bytes[5+deviceid_length];
|
||||
devicetype_length = qs_bytes[5+deviceid_length+1+policy_length];
|
||||
deviceType = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(5+deviceid_length+1+policy_length+1, devicetype_length)]
|
||||
encoding: NSASCIIStringEncoding];
|
||||
AUTORELEASE(deviceType);
|
||||
|
||||
[components addObject: [NSString stringWithFormat: @"deviceType=%@", deviceType]];
|
||||
|
||||
// Command Parameters
|
||||
i = 5+deviceid_length+1+policy_length+1+devicetype_length;
|
||||
|
||||
while (i < [queryString length])
|
||||
{
|
||||
parameter_code = qs_bytes[i];
|
||||
parameter_length = qs_bytes[i+1];
|
||||
parameterValue = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(i+1+1, parameter_length)]
|
||||
encoding: NSASCIIStringEncoding];
|
||||
|
||||
AUTORELEASE(parameterValue);
|
||||
|
||||
// parameter_code 7 == Options
|
||||
// http://msdn.microsoft.com/en-us/library/ee237789(v=exchg.80).aspx
|
||||
if (parameter_code == 7)
|
||||
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code],
|
||||
([parameterValue isEqualToString: @"\001"]) ? @"SaveInSent" : @"AcceptMultiPart"]];
|
||||
else
|
||||
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], parameterValue]];
|
||||
|
||||
i = i + 1 + 1 + parameter_length;
|
||||
}
|
||||
}
|
||||
components = [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"];
|
||||
|
||||
for (i = 0; i < [components count]; i++)
|
||||
{
|
||||
@@ -355,23 +186,6 @@ static NSArray *easCommandParameters = nil;
|
||||
return s;
|
||||
}
|
||||
|
||||
// This method extracts the "AttachmentName" from a URI:
|
||||
//
|
||||
// /SOGo/Microsoft-Server-ActiveSync?Cmd=GetAttachment&User=sogo&DeviceId=HTCa04b4932597acd3f2dc1a918b9728&DeviceType=htcvision&AttachmentName=mail/TestFldr/8/2
|
||||
//
|
||||
- (NSString *) attachmentName
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
s = [self _valueForParameter: @"ATTACHMENTNAME="];
|
||||
|
||||
if (!s)
|
||||
s = @"Unknown";
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -387,43 +201,6 @@ static NSArray *easCommandParameters = nil;
|
||||
return s;
|
||||
}
|
||||
|
||||
- (NSString *) itemid
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
s = [self _valueForParameter: @"ITEMID="];
|
||||
|
||||
if (!s)
|
||||
s = @"Unknown";
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
- (NSString *) collectionid
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
s = [self _valueForParameter: @"COLLECTIONID="];
|
||||
|
||||
if (!s)
|
||||
s = @"Unknown";
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
- (BOOL) acceptsMultiPart
|
||||
{
|
||||
NSString *s;
|
||||
|
||||
s = [self _valueForParameter: @"OPTIONS="];
|
||||
|
||||
if (s && [s rangeOfString: @"AcceptMultiPart" options: NSCaseInsensitiveSearch].location != NSNotFound)
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// FIXME: combine with our OpenChange code.
|
||||
//
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ to negotiate the fees associated to your user base.
|
||||
|
||||
To contact Microsoft, please visit:
|
||||
|
||||
http://www.microsoft.com/en-us/legal/intellectualproperty/
|
||||
http://www.microsoft.com/en-us/legal/intellectualproperty/IPLicensing/Programs/exchangeactivesyncprotocol.aspx
|
||||
|
||||
and send an email to iplicreq@microsoft.com
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
+502
-1616
File diff suppressed because it is too large.
Load diff
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include "SOGoMailObject+ActiveSync.h"
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSException.h>
|
||||
@@ -47,9 +48,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGExtensions/NSString+Encoding.h>
|
||||
#import <NGImap4/NGImap4Envelope.h>
|
||||
#import <NGImap4/NGImap4EnvelopeAddress.h>
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WOApplication.h>
|
||||
|
||||
#import <NGMime/NGMimeBodyPart.h>
|
||||
#import <NGMime/NGMimeFileData.h>
|
||||
@@ -59,10 +58,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGMail/NGMimeMessage.h>
|
||||
#import <NGMail/NGMimeMessageGenerator.h>
|
||||
|
||||
#import <Mailer/SOGoMailLabel.h>
|
||||
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
|
||||
#include "iCalTimeZone+ActiveSync.h"
|
||||
#include "NSData+ActiveSync.h"
|
||||
#include "NSDate+ActiveSync.h"
|
||||
@@ -72,45 +67,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <Appointments/iCalPerson+SOGo.h>
|
||||
#include <Mailer/NSString+Mail.h>
|
||||
#include <Mailer/SOGoMailBodyPart.h>
|
||||
|
||||
#include <SOGo/SOGoUser.h>
|
||||
#include <SOGo/NSString+Utilities.h>
|
||||
|
||||
#import <Appointments/SOGoAptMailNotification.h>
|
||||
|
||||
unsigned char strToChar(char a, char b) {
|
||||
char encoder[3] = {'\0','\0','\0'};
|
||||
encoder[0] = a;
|
||||
encoder[1] = b;
|
||||
return (char) strtol(encoder,NULL,16);
|
||||
}
|
||||
|
||||
@interface NSString (NSStringExtensions)
|
||||
- (NSData *) decodeFromHexidecimal;
|
||||
@end
|
||||
|
||||
@implementation NSString (NSStringExtensions)
|
||||
|
||||
- (NSData *) decodeFromHexidecimal;
|
||||
{
|
||||
const char * bytes = [self cStringUsingEncoding: NSUTF8StringEncoding];
|
||||
NSUInteger length = strlen(bytes);
|
||||
unsigned char * r = (unsigned char *) malloc(length / 2 + 1);
|
||||
unsigned char * index = r;
|
||||
|
||||
while ((*bytes) && (*(bytes +1))) {
|
||||
*index = strToChar(*bytes, *(bytes +1));
|
||||
index++;
|
||||
bytes+=2;
|
||||
}
|
||||
*index = '\0';
|
||||
|
||||
NSData * result = [NSData dataWithBytes: r length: length / 2];
|
||||
free(r);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
typedef struct {
|
||||
uint32_t dwLowDateTime;
|
||||
@@ -126,7 +84,7 @@ struct GlobalObjectId {
|
||||
FILETIME CreationTime;
|
||||
uint8_t X[8];
|
||||
uint32_t Size;
|
||||
uint8_t Data[0];
|
||||
uint8_t* Data;
|
||||
};
|
||||
|
||||
@implementation SOGoMailObject (ActiveSync)
|
||||
@@ -153,40 +111,39 @@ struct GlobalObjectId {
|
||||
//
|
||||
// The GlobalObjId is documented here: http://msdn.microsoft.com/en-us/library/ee160198(v=EXCHG.80).aspx
|
||||
//
|
||||
|
||||
- (NSData *) _computeGlobalObjectIdFromEvent: (iCalEvent *) event
|
||||
{
|
||||
NSData *binPrefix, *globalObjectId, *uidAsASCII;
|
||||
NSString *prefix, *uid;
|
||||
struct GlobalObjectId *newGlobalId;
|
||||
|
||||
struct GlobalObjectId newGlobalId;
|
||||
const char *bytes;
|
||||
|
||||
uid = [event uid];
|
||||
uidAsASCII = [uid decodeFromHexidecimal];
|
||||
newGlobalId = (struct GlobalObjectId*)calloc(sizeof(uint8_t), sizeof(struct GlobalObjectId) + 0x0c + [uidAsASCII length]);
|
||||
|
||||
|
||||
prefix = @"040000008200e00074c5b7101a82e008";
|
||||
|
||||
// dataPrefix is "vCal-Uid %x01 %x00 %x00 %x00"
|
||||
uint8_t dataPrefix[] = { 0x76, 0x43, 0x61, 0x6c, 0x2d, 0x55, 0x69, 0x64, 0x01, 0x00, 0x00, 0x00 };
|
||||
uid = [event uid];
|
||||
|
||||
binPrefix = [prefix convertHexStringToBytes];
|
||||
[binPrefix getBytes: &newGlobalId->ByteArrayID];
|
||||
[self _setInstanceDate: newGlobalId
|
||||
[binPrefix getBytes: &newGlobalId.ByteArrayID];
|
||||
[self _setInstanceDate: &newGlobalId
|
||||
fromDate: [event recurrenceId]];
|
||||
uidAsASCII = [uid dataUsingEncoding: NSASCIIStringEncoding];
|
||||
bytes = [uidAsASCII bytes];
|
||||
|
||||
// 0x0c is the size of our dataPrefix
|
||||
newGlobalId->Size = 0x0c + [uidAsASCII length];
|
||||
memcpy(newGlobalId->Data, dataPrefix, 0x0c);
|
||||
memcpy(newGlobalId->Data + 0x0c, bytes, newGlobalId->Size - 0x0c);
|
||||
newGlobalId.Size = 0x0c + [uidAsASCII length];
|
||||
newGlobalId.Data = malloc(newGlobalId.Size * sizeof(uint8_t));
|
||||
memcpy(newGlobalId.Data, dataPrefix, 0x0c);
|
||||
memcpy(newGlobalId.Data + 0x0c, bytes, newGlobalId.Size - 0x0c);
|
||||
|
||||
globalObjectId = [[NSData alloc] initWithBytes: newGlobalId length: 40 + newGlobalId->Size*sizeof(uint8_t)];
|
||||
free(newGlobalId);
|
||||
globalObjectId = [[NSData alloc] initWithBytes: &newGlobalId length: 40 + newGlobalId.Size*sizeof(uint8_t)];
|
||||
free(newGlobalId.Data);
|
||||
|
||||
return [globalObjectId autorelease];
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// For debugging purposes...
|
||||
//
|
||||
@@ -248,15 +205,12 @@ struct GlobalObjectId {
|
||||
//
|
||||
//
|
||||
- (NSData *) _preferredBodyDataInMultipartUsingType: (int) theType
|
||||
nativeTypeFound: (int *) theNativeTypeFound
|
||||
{
|
||||
NSString *encoding, *key, *plainKey, *htmlKey, *type, *subtype;
|
||||
NSDictionary *textParts, *part;
|
||||
NSEnumerator *e;
|
||||
NSData *d;
|
||||
|
||||
BOOL ignore;
|
||||
|
||||
textParts = [self fetchPlainTextParts];
|
||||
e = [textParts keyEnumerator];
|
||||
plainKey = nil;
|
||||
@@ -265,35 +219,10 @@ struct GlobalObjectId {
|
||||
|
||||
while ((key = [e nextObject]))
|
||||
{
|
||||
// Walk the hierarchy up and check whether parents are of type mulipart - i.e. ignore message/rfc822
|
||||
if ([key countOccurrencesOfString: @"."] > 0)
|
||||
{
|
||||
NSMutableArray *a;
|
||||
|
||||
a = [[[key componentsSeparatedByString: @"."] mutableCopy] autorelease];
|
||||
ignore = NO;
|
||||
|
||||
while ([a count] > 0)
|
||||
{
|
||||
[a removeLastObject];
|
||||
part = [self lookupInfoForBodyPart: [a componentsJoinedByString: @"."]];
|
||||
|
||||
if (![[part valueForKey: @"type"] isEqualToString: @"multipart"])
|
||||
ignore = YES;
|
||||
}
|
||||
|
||||
if (ignore)
|
||||
continue;
|
||||
}
|
||||
|
||||
part = [self lookupInfoForBodyPart: key];
|
||||
type = [part valueForKey: @"type"];
|
||||
subtype = [part valueForKey: @"subtype"];
|
||||
|
||||
// Don't select an attachment as body
|
||||
if ([[[part valueForKey: @"disposition"] valueForKey: @"type"] isEqualToString: @"attachment"])
|
||||
continue;
|
||||
|
||||
if ([type isEqualToString: @"text"] && [subtype isEqualToString: @"html"])
|
||||
htmlKey = key;
|
||||
else if ([type isEqualToString: @"text"] && [subtype isEqualToString: @"plain"])
|
||||
@@ -301,27 +230,14 @@ struct GlobalObjectId {
|
||||
}
|
||||
|
||||
key = nil;
|
||||
*theNativeTypeFound = 1;
|
||||
|
||||
if (theType == 2 && htmlKey)
|
||||
{
|
||||
key = htmlKey;
|
||||
*theNativeTypeFound = 2;
|
||||
}
|
||||
else if (theType == 1 && plainKey)
|
||||
if (theType == 2)
|
||||
key = htmlKey;
|
||||
else if (theType == 1)
|
||||
key = plainKey;
|
||||
else if (theType == 2 && plainKey)
|
||||
key = plainKey;
|
||||
else if (theType == 1 && htmlKey)
|
||||
{
|
||||
key = htmlKey;
|
||||
*theNativeTypeFound = 2;
|
||||
}
|
||||
|
||||
if (key)
|
||||
{
|
||||
NSString *s, *charset;
|
||||
|
||||
d = [[self fetchPlainTextParts] objectForKey: key];
|
||||
|
||||
encoding = [[self lookupInfoForBodyPart: key] objectForKey: @"encoding"];
|
||||
@@ -330,22 +246,6 @@ struct GlobalObjectId {
|
||||
d = [d dataByDecodingBase64];
|
||||
else if ([encoding caseInsensitiveCompare: @"quoted-printable"] == NSOrderedSame)
|
||||
d = [d dataByDecodingQuotedPrintableTransferEncoding];
|
||||
|
||||
charset = [[[self lookupInfoForBodyPart: key] objectForKey: @"parameterList"] objectForKey: @"charset"];
|
||||
|
||||
if (![charset length])
|
||||
charset = @"utf-8";
|
||||
|
||||
s = [NSString stringWithData: d usingEncodingNamed: charset];
|
||||
|
||||
// We fallback to ISO-8859-1 string encoding
|
||||
if (!s)
|
||||
s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease];
|
||||
|
||||
if (theType == 1 && *theNativeTypeFound == 2)
|
||||
s = [s htmlToText];
|
||||
|
||||
d = [s dataUsingEncoding: NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
return d;
|
||||
@@ -373,7 +273,7 @@ struct GlobalObjectId {
|
||||
performed: b];
|
||||
}
|
||||
}
|
||||
else if ([thePart isKindOfClass: [NGMimeBodyPart class]] || [thePart isKindOfClass: [NGMimeMessage class]])
|
||||
else if ([thePart isKindOfClass: [NGMimeBodyPart class]])
|
||||
{
|
||||
NGMimeFileData *fdata;
|
||||
id body;
|
||||
@@ -389,24 +289,20 @@ struct GlobalObjectId {
|
||||
[[[thePart contentType] type] isEqualToString: @"text"] &&
|
||||
([[[thePart contentType] subType] isEqualToString: @"plain"] || [[[thePart contentType] subType] isEqualToString: @"html"]))
|
||||
{
|
||||
// We make sure everything is encoded in UTF-8.
|
||||
// We make sure everything is encoded in UTF-8
|
||||
NGMimeType *mimeType;
|
||||
NSString *s;
|
||||
|
||||
if ([body isKindOfClass: [NSData class]])
|
||||
{
|
||||
NSString *charset;
|
||||
|
||||
int encoding;
|
||||
|
||||
charset = [[thePart contentType] valueOfParameter: @"charset"];
|
||||
|
||||
if (![charset length])
|
||||
charset = @"utf-8";
|
||||
encoding = [NGMimeType stringEncodingForCharset: charset];
|
||||
|
||||
s = [NSString stringWithData: body usingEncodingNamed: charset];
|
||||
|
||||
// We fallback to ISO-8859-1 string encoding. We avoid #3103.
|
||||
if (!s)
|
||||
s = [[[NSString alloc] initWithData: body encoding: NSISOLatin1StringEncoding] autorelease];
|
||||
s = [[NSString alloc] initWithData: body encoding: encoding];
|
||||
AUTORELEASE(s);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -456,7 +352,8 @@ struct GlobalObjectId {
|
||||
|
||||
if (message)
|
||||
{
|
||||
[self _sanitizedMIMEPart: message performed: &b];
|
||||
[self _sanitizedMIMEPart: [message body]
|
||||
performed: &b];
|
||||
|
||||
if (b)
|
||||
{
|
||||
@@ -497,15 +394,8 @@ struct GlobalObjectId {
|
||||
// We get the right part based on the preference
|
||||
if (theType == 1 || theType == 2)
|
||||
{
|
||||
if ([type isEqualToString: @"text"] && ![subtype isEqualToString: @"calendar"])
|
||||
if ([type isEqualToString: @"text"])
|
||||
{
|
||||
NSString *s, *charset;
|
||||
|
||||
charset = [[[self lookupInfoForBodyPart: @""] objectForKey: @"parameterList"] objectForKey: @"charset"];
|
||||
|
||||
if (![charset length])
|
||||
charset = @"utf-8";
|
||||
|
||||
d = [[self fetchPlainTextParts] objectForKey: @""];
|
||||
|
||||
// We check if we have base64 encoded parts. If so, we just
|
||||
@@ -517,31 +407,28 @@ struct GlobalObjectId {
|
||||
else if ([encoding caseInsensitiveCompare: @"quoted-printable"] == NSOrderedSame)
|
||||
d = [d dataByDecodingQuotedPrintableTransferEncoding];
|
||||
|
||||
s = [NSString stringWithData: d usingEncodingNamed: charset];
|
||||
|
||||
// We fallback to ISO-8859-1 string encoding. We avoid #3103.
|
||||
if (!s)
|
||||
s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease];
|
||||
|
||||
// Check if we must convert html->plain
|
||||
if (theType == 1 && [subtype isEqualToString: @"html"])
|
||||
{
|
||||
s = [s htmlToText];
|
||||
}
|
||||
NSString *s;
|
||||
|
||||
s = [[NSString alloc] initWithData: d encoding: NSUTF8StringEncoding];
|
||||
AUTORELEASE(s);
|
||||
|
||||
d = [s dataUsingEncoding: NSUTF8StringEncoding];
|
||||
s = [s htmlToText];
|
||||
d = [s dataUsingEncoding: NSUTF8StringEncoding];
|
||||
}
|
||||
}
|
||||
else if ([type isEqualToString: @"multipart"])
|
||||
{
|
||||
d = [self _preferredBodyDataInMultipartUsingType: theType nativeTypeFound: theNativeType];
|
||||
d = [self _preferredBodyDataInMultipartUsingType: theType];
|
||||
}
|
||||
}
|
||||
else if (theType == 4)
|
||||
{
|
||||
// We sanitize the content *ONLY* for Outlook clients and if the content-transfer-encoding is 8bit. Outlook has strange issues
|
||||
// We sanitize the content *ONLY* for Outlook clients. Outlook has strange issues
|
||||
// with quoted-printable/base64 encoded text parts. It just doesn't decode them.
|
||||
encoding = [[self lookupInfoForBodyPart: @""] objectForKey: @"encoding"];
|
||||
if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"] || ([encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame))
|
||||
if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"])
|
||||
d = [self _sanitizedMIMEMessage];
|
||||
else
|
||||
d = [self content];
|
||||
@@ -550,65 +437,15 @@ struct GlobalObjectId {
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
- (NSString *) _getNormalizedSubject
|
||||
{
|
||||
NSString *subject;
|
||||
NSUInteger colIdx;
|
||||
NSString *stringValue;
|
||||
|
||||
subject = [[self subject] decodedHeader];
|
||||
|
||||
colIdx = [subject rangeOfString: @":" options:NSBackwardsSearch].location;
|
||||
if (colIdx != NSNotFound && colIdx + 1 < [subject length])
|
||||
stringValue = [[subject substringFromIndex: colIdx + 1] stringByTrimmingLeadSpaces];
|
||||
else
|
||||
stringValue = subject;
|
||||
|
||||
if (!stringValue)
|
||||
stringValue = @"";
|
||||
|
||||
return stringValue;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (iCalCalendar *) calendarFromIMIPMessage
|
||||
{
|
||||
NSDictionary *part;
|
||||
NSString *type, *subtype;
|
||||
NSArray *parts;
|
||||
int i;
|
||||
|
||||
type = [[[self bodyStructure] valueForKey: @"type"] lowercaseString];
|
||||
subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString];
|
||||
|
||||
// process mail of type text/calendar
|
||||
if ([type isEqualToString: @"text"] && [subtype isEqualToString: @"calendar"])
|
||||
{
|
||||
iCalCalendar *calendar;
|
||||
NSString *encoding;
|
||||
NSData *calendarData;
|
||||
|
||||
encoding = [[[self bodyStructure] valueForKey: @"encoding"] lowercaseString];
|
||||
calendarData = [[self fetchPlainTextParts] objectForKey: @""];
|
||||
|
||||
if ([encoding caseInsensitiveCompare: @"base64"] == NSOrderedSame)
|
||||
calendarData = [calendarData dataByDecodingBase64];
|
||||
else if ([encoding caseInsensitiveCompare: @"quoted-printable"] == NSOrderedSame)
|
||||
calendarData = [calendarData dataByDecodingQuotedPrintableTransferEncoding];
|
||||
|
||||
NS_DURING
|
||||
calendar = [iCalCalendar parseSingleFromSource: calendarData];
|
||||
NS_HANDLER
|
||||
calendar = nil;
|
||||
NS_ENDHANDLER
|
||||
|
||||
return calendar;
|
||||
}
|
||||
|
||||
// We check if we have at least 2 parts and if one of them is a text/calendar
|
||||
parts = [[self bodyStructure] objectForKey: @"parts"];
|
||||
|
||||
@@ -654,13 +491,10 @@ struct GlobalObjectId {
|
||||
//
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) _context
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
NSData *d, *globalObjId;
|
||||
NSArray *attachmentKeys;
|
||||
NSMutableString *s;
|
||||
|
||||
uint32_t v;
|
||||
NSString *p;
|
||||
|
||||
id value;
|
||||
|
||||
iCalCalendar *calendar;
|
||||
@@ -685,7 +519,7 @@ struct GlobalObjectId {
|
||||
if (value)
|
||||
{
|
||||
[s appendFormat: @"<Subject xmlns=\"Email:\">%@</Subject>", [value activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<ThreadTopic xmlns=\"Email:\">%@</ThreadTopic>", [[self _getNormalizedSubject] activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<ThreadTopic xmlns=\"Email:\">%@</ThreadTopic>", [value activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
// DateReceived
|
||||
@@ -701,34 +535,8 @@ struct GlobalObjectId {
|
||||
if (value)
|
||||
[s appendFormat: @"<Cc xmlns=\"Email:\">%@</Cc>", [value activeSyncRepresentationInContext: context]];
|
||||
|
||||
// Importance
|
||||
v = 0x1;
|
||||
value = [[self mailHeaders] objectForKey: @"x-priority"];
|
||||
if ([value isKindOfClass: [NSArray class]])
|
||||
p = [value lastObject];
|
||||
else
|
||||
p = value;
|
||||
|
||||
if (p)
|
||||
{
|
||||
if ([p hasPrefix: @"1"]) v = 0x2;
|
||||
else if ([p hasPrefix: @"2"]) v = 0x2;
|
||||
else if ([p hasPrefix: @"4"]) v = 0x0;
|
||||
else if ([p hasPrefix: @"5"]) v = 0x0;
|
||||
}
|
||||
else
|
||||
{
|
||||
value = [[self mailHeaders] objectForKey: @"importance"];
|
||||
if ([value isKindOfClass: [NSArray class]])
|
||||
p = [value lastObject];
|
||||
else
|
||||
p = value;
|
||||
|
||||
if ([p hasPrefix: @"High"]) v = 0x2;
|
||||
else if ([p hasPrefix: @"Low"]) v = 0x0;
|
||||
}
|
||||
|
||||
[s appendFormat: @"<Importance xmlns=\"Email:\">%d</Importance>", v];
|
||||
// Importance - FIXME
|
||||
[s appendFormat: @"<Importance xmlns=\"Email:\">%@</Importance>", @"1"];
|
||||
|
||||
// Read
|
||||
[s appendFormat: @"<Read xmlns=\"Email:\">%d</Read>", ([self read] ? 1 : 0)];
|
||||
@@ -792,18 +600,18 @@ struct GlobalObjectId {
|
||||
|
||||
[s appendFormat: @"<AllDayEvent xmlns=\"Email:\">%d</AllDayEvent>", ([event isAllDay] ? 1 : 0)];
|
||||
|
||||
// StartTime -- https://msdn.microsoft.com/en-us/library/ee203365%28v=exchg.80%29.aspx
|
||||
// StartTime -- http://msdn.microsoft.com/en-us/library/ee157132(v=exchg.80).aspx
|
||||
if ([event startDate])
|
||||
[s appendFormat: @"<StartTime xmlns=\"Email:\">%@</StartTime>", [[event startDate] activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<StartTime xmlns=\"Email:\">%@</StartTime>", [[event startDate] activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
||||
|
||||
if ([event timeStampAsDate])
|
||||
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[event timeStampAsDate] activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[event timeStampAsDate] activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
||||
else if ([event created])
|
||||
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[event created] activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[event created] activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
||||
|
||||
// EndTime -- https://msdn.microsoft.com/en-us/library/ee158628(v=exchg.80).aspx
|
||||
// EndTime -- http://msdn.microsoft.com/en-us/library/ee157945(v=exchg.80).aspx
|
||||
if ([event endDate])
|
||||
[s appendFormat: @"<EndTime xmlns=\"Email:\">%@</EndTime>", [[event endDate] activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<EndTime xmlns=\"Email:\">%@</EndTime>", [[event endDate] activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
||||
|
||||
// FIXME: Single appointment - others are not supported right now
|
||||
[s appendFormat: @"<InstanceType xmlns=\"Email:\">%d</InstanceType>", 0];
|
||||
@@ -851,9 +659,7 @@ struct GlobalObjectId {
|
||||
[s appendFormat: @"<GlobalObjId xmlns=\"Email:\">%@</GlobalObjId>", [globalObjId activeSyncRepresentationInContext: context]];
|
||||
|
||||
// We set the right message type - we must set AS version to 14.1 for this
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"])
|
||||
[s appendFormat: @"<MeetingMessageType xmlns=\"Email2:\">%d</MeetingMessageType>", 1];
|
||||
|
||||
[s appendFormat: @"<MeetingMessageType xmlns=\"Email2:\">%d</MeetingMessageType>", 1];
|
||||
[s appendString: @"</MeetingRequest>"];
|
||||
|
||||
// ContentClass
|
||||
@@ -878,82 +684,19 @@ struct GlobalObjectId {
|
||||
// Body - namespace 17
|
||||
preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue];
|
||||
|
||||
// Make use of a local pool here as _preferredBodyDataUsingType:nativeType: will consume
|
||||
// a significant amout of RAM and file descriptors
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
nativeBodyType = 1;
|
||||
d = [self _preferredBodyDataUsingType: preferredBodyType nativeType: &nativeBodyType];
|
||||
|
||||
if (calendar && !d)
|
||||
{
|
||||
WOApplication *app;
|
||||
SOGoAptMailNotification *p;
|
||||
NSString *pageName;
|
||||
|
||||
nativeBodyType = 2;
|
||||
|
||||
/* get WOApplication instance */
|
||||
app = [WOApplication application];
|
||||
|
||||
/* create page name */
|
||||
pageName = [NSString stringWithFormat: @"SOGoAptMail%@", @"Invitation"];
|
||||
/* construct message content */
|
||||
p = [app pageWithName: pageName inContext: context];
|
||||
[p setApt: (iCalEvent *) [[calendar events] lastObject]];
|
||||
|
||||
if ([[ [[calendar events] lastObject] organizer] cn] && [[[ [[calendar events] lastObject] organizer] cn] length])
|
||||
{
|
||||
[p setOrganizerName: [[ [[calendar events] lastObject] organizer] cn]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[p setOrganizerName: [[SOGoUser userWithLogin: owner] cn]];
|
||||
}
|
||||
|
||||
if (preferredBodyType == 1 && nativeBodyType == 2)
|
||||
d = [[[p getBody] htmlToText] dataUsingEncoding: NSUTF8StringEncoding];
|
||||
else
|
||||
{
|
||||
preferredBodyType = 2;
|
||||
d = [[p getBody] dataUsingEncoding: NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (d)
|
||||
{
|
||||
NSMutableData *sanitizedData;
|
||||
NSString *content;
|
||||
int len, truncated;
|
||||
|
||||
// Outlook fails to decode quoted-printable (see #3082) if lines are not termined by CRLF.
|
||||
const char *bytes;
|
||||
char *mbytes;
|
||||
int mlen;
|
||||
|
||||
len = [d length];
|
||||
mlen = 0;
|
||||
|
||||
sanitizedData = [NSMutableData dataWithLength: len*2];
|
||||
|
||||
bytes = [d bytes];
|
||||
mbytes = [sanitizedData mutableBytes];
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
if (*bytes == '\n' && *(bytes-1) != '\r' && mlen > 0)
|
||||
{
|
||||
*mbytes = '\r';
|
||||
mbytes++;
|
||||
mlen++;
|
||||
}
|
||||
|
||||
*mbytes = *bytes;
|
||||
mbytes++; bytes++;
|
||||
len--;
|
||||
mlen++;
|
||||
}
|
||||
|
||||
[sanitizedData setLength: mlen];
|
||||
|
||||
content = [[NSString alloc] initWithData: sanitizedData encoding: NSUTF8StringEncoding];
|
||||
|
||||
content = [[NSString alloc] initWithData: d encoding: NSUTF8StringEncoding];
|
||||
|
||||
// FIXME: This is a hack. We should normally avoid doing this as we might get
|
||||
// broken encodings. We should rather tell that the data was truncated and expect
|
||||
@@ -963,53 +706,38 @@ struct GlobalObjectId {
|
||||
// for an "interesting" discussion around this.
|
||||
//
|
||||
if (!content)
|
||||
content = [[NSString alloc] initWithData: sanitizedData encoding: NSISOLatin1StringEncoding];
|
||||
content = [[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding];
|
||||
|
||||
AUTORELEASE(content);
|
||||
|
||||
content = [content activeSyncRepresentationInContext: context];
|
||||
truncated = 0;
|
||||
|
||||
|
||||
len = [content length];
|
||||
|
||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||
[s appendFormat: @"<Type>%d</Type>", preferredBodyType];
|
||||
[s appendFormat: @"<Truncated>%d</Truncated>", truncated];
|
||||
[s appendFormat: @"<Preview></Preview>"];
|
||||
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
if (!truncated)
|
||||
{
|
||||
[s appendFormat: @"<Body xmlns=\"Email:\">%@</Body>", content];
|
||||
[s appendFormat: @"<BodyTruncated xmlns=\"Email:\">%d</BodyTruncated>", truncated];
|
||||
[s appendFormat: @"<Data>%@</Data>", content];
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||
|
||||
// Set the correct type if client requested text/html but we got text/plain
|
||||
if (preferredBodyType == 2 && nativeBodyType == 1)
|
||||
[s appendString: @"<Type>1</Type>"];
|
||||
else
|
||||
[s appendFormat: @"<Type>%d</Type>", preferredBodyType];
|
||||
|
||||
[s appendFormat: @"<Truncated>%d</Truncated>", truncated];
|
||||
[s appendFormat: @"<Preview></Preview>"];
|
||||
|
||||
if (!truncated)
|
||||
{
|
||||
[s appendFormat: @"<Data>%@</Data>", content];
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
|
||||
}
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
|
||||
|
||||
DESTROY(pool);
|
||||
|
||||
// Attachments -namespace 16
|
||||
attachmentKeys = [self fetchFileAttachmentKeys];
|
||||
if ([attachmentKeys count])
|
||||
{
|
||||
int i;
|
||||
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
[s appendString: @"<Attachments xmlns=\"Email:\">"];
|
||||
else
|
||||
[s appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
|
||||
|
||||
|
||||
[s appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
|
||||
|
||||
for (i = 0; i < [attachmentKeys count]; i++)
|
||||
{
|
||||
value = [attachmentKeys objectAtIndex: i];
|
||||
@@ -1020,22 +748,11 @@ struct GlobalObjectId {
|
||||
// FileReference must be a unique identifier across the whole store. We use the following structure:
|
||||
// mail/<foldername>/<message UID/<pathofpart>
|
||||
// mail/INBOX/2
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
[s appendFormat: @"<AttName>mail/%@/%@/%@</AttName>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
|
||||
else
|
||||
[s appendFormat: @"<FileReference>mail/%@/%@/%@</FileReference>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
|
||||
[s appendFormat: @"<FileReference>mail/%@/%@/%@</FileReference>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
|
||||
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
[s appendFormat: @"<AttMethod>%d</AttMethod>", 1];
|
||||
[s appendFormat: @"<AttSize>%d</AttSize>", [[value objectForKey: @"size"] intValue]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendFormat: @"<Method>%d</Method>", 1]; // See: http://msdn.microsoft.com/en-us/library/ee160322(v=exchg.80).aspx
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [[value objectForKey: @"size"] intValue]];
|
||||
//[s appendFormat: @"<IsInline>%d</IsInline>", 1];
|
||||
}
|
||||
[s appendFormat: @"<Method>%d</Method>", 1]; // See: http://msdn.microsoft.com/en-us/library/ee160322(v=exchg.80).aspx
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [[value objectForKey: @"size"] intValue]];
|
||||
//[s appendFormat: @"<IsInline>%d</IsInline>", 1];
|
||||
[s appendString: @"</Attachment>"];
|
||||
}
|
||||
|
||||
@@ -1044,48 +761,12 @@ struct GlobalObjectId {
|
||||
|
||||
// Flags
|
||||
[s appendString: @"<Flag xmlns=\"Email:\">"];
|
||||
[s appendFormat: @"<FlagStatus>%d</FlagStatus>", ([self flagged] ? 2 : 0)];
|
||||
[s appendFormat: @"<FlagStatus>%d</FlagStatus>", 0];
|
||||
[s appendString: @"</Flag>"];
|
||||
|
||||
|
||||
// Categroies/Labels
|
||||
NSEnumerator *categories;
|
||||
categories = [[[self fetchCoreInfos] objectForKey: @"flags"] objectEnumerator];
|
||||
|
||||
if (categories)
|
||||
{
|
||||
NSString *currentFlag;
|
||||
NSDictionary *v;
|
||||
|
||||
v = [[[context activeUser] userDefaults] mailLabelsColors];
|
||||
|
||||
[s appendFormat: @"<Categories xmlns=\"Email:\">"];
|
||||
while ((currentFlag = [categories nextObject]))
|
||||
{
|
||||
if ([[v objectForKey: currentFlag] objectAtIndex:0])
|
||||
[s appendFormat: @"<Category>%@</Category>", [[[v objectForKey: currentFlag] objectAtIndex:0] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
[s appendFormat: @"</Categories>"];
|
||||
}
|
||||
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] ||
|
||||
[[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"])
|
||||
{
|
||||
NSString *reference;
|
||||
|
||||
reference = [[[[self mailHeaders] objectForKey: @"references"] componentsSeparatedByString: @" "] objectAtIndex: 0];
|
||||
|
||||
if ([reference length] > 0)
|
||||
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[reference dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
|
||||
else if ([self inReplyTo])
|
||||
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self inReplyTo] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
|
||||
else if ([self messageId])
|
||||
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self messageId] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
// FIXME - support these in the future
|
||||
//[s appendString: @"<ConversationId xmlns=\"Email2:\">foobar</ConversationId>"];
|
||||
//[s appendString: @"<ConversationIndex xmlns=\"Email2:\">zot=</ConversationIndex>"];
|
||||
|
||||
|
||||
// NativeBodyType -- http://msdn.microsoft.com/en-us/library/ee218276(v=exchg.80).aspx
|
||||
// This is a required child element.
|
||||
@@ -1118,21 +799,10 @@ struct GlobalObjectId {
|
||||
|
||||
if ((o = [theValues objectForKey: @"Flag"]))
|
||||
{
|
||||
// We must handle empty flags -> {Flag = ""; } - some ActiveSync clients, like the HTC Desire
|
||||
// will send an empty Flag message when "unflagging" a mail.
|
||||
if (([o isKindOfClass: [NSMutableDictionary class]]))
|
||||
{
|
||||
if ((o = [o objectForKey: @"FlagStatus"]))
|
||||
{
|
||||
// 0 = The flag is cleared.
|
||||
// 1 = The status is set to complete.
|
||||
// 2 = The status is set to active.
|
||||
if (([o isEqualToString: @"2"]))
|
||||
[self addFlags: @"\\Flagged"];
|
||||
else
|
||||
[self removeFlags: @"\\Flagged"];
|
||||
}
|
||||
}
|
||||
o = [o objectForKey: @"FlagStatus"];
|
||||
|
||||
if ([o intValue])
|
||||
[self addFlags: @"\\Flagged"];
|
||||
else
|
||||
[self removeFlags: @"\\Flagged"];
|
||||
}
|
||||
@@ -1144,65 +814,6 @@ struct GlobalObjectId {
|
||||
else
|
||||
[self removeFlags: @"seen"];;
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"Categories"]))
|
||||
{
|
||||
NSEnumerator *categories;
|
||||
NSString *currentFlag;
|
||||
NSDictionary *v;
|
||||
|
||||
v = [[[context activeUser] userDefaults] mailLabelsColors];
|
||||
|
||||
// add categories/labels sent from client
|
||||
if ([o isKindOfClass: [NSArray class]])
|
||||
{
|
||||
NSEnumerator *enumerator;
|
||||
NSMutableArray *labels;
|
||||
NSEnumerator *flags;
|
||||
id key;
|
||||
|
||||
labels = [NSMutableArray array];
|
||||
|
||||
enumerator = [v keyEnumerator];
|
||||
flags = [o objectEnumerator];
|
||||
|
||||
while ((currentFlag = [flags nextObject]))
|
||||
{
|
||||
while ((key = [enumerator nextObject]))
|
||||
{
|
||||
if (([currentFlag isEqualToString:[[v objectForKey:key] objectAtIndex:0]]))
|
||||
{
|
||||
[labels addObject: key];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[self addFlags: [labels componentsJoinedByString: @" "]];
|
||||
}
|
||||
|
||||
categories = [[[self fetchCoreInfos] objectForKey: @"flags"] objectEnumerator];
|
||||
|
||||
// remove all categories/labels from server which were not it the list sent from client
|
||||
if (categories)
|
||||
{
|
||||
while ((currentFlag = [categories nextObject]))
|
||||
{
|
||||
// only deal with lables and don't touch flags like seen and flagged
|
||||
if (([v objectForKey: currentFlag]))
|
||||
{
|
||||
if (![o isKindOfClass: [NSArray class]])
|
||||
{
|
||||
[self removeFlags: currentFlag];
|
||||
}
|
||||
else if (([o indexOfObject: [[v objectForKey:currentFlag] objectAtIndex:0]] == NSNotFound))
|
||||
{
|
||||
[self removeFlags: currentFlag];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -55,7 +55,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[o setUID: theUID];
|
||||
[o setSequence: theSequence];
|
||||
|
||||
return [o autorelease];
|
||||
return o;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
|
||||
@@ -61,7 +61,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[response setHeader: @"private" forKey: @"Cache-Control"];
|
||||
[response setHeader: @"OPTIONS, POST" forKey: @"Allow"];
|
||||
[response setHeader: @"14.1" forKey: @"MS-Server-ActiveSync"];
|
||||
[response setHeader: @"2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
|
||||
[response setHeader: @"2.0,2.1,2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
|
||||
[response setHeader: @"Sync,SendMail,SmartForward,SmartReply,GetAttachment,GetHierarchy,CreateCollection,DeleteCollection,MoveCollection,FolderSync,FolderCreate,FolderDelete,FolderUpdate,MoveItems,GetItemEstimate,MeetingResponse,Search,Settings,Ping,ItemOperations,ResolveRecipients,ValidateCert" forKey: @"MS-ASProtocolCommands"];
|
||||
[response setHeader: @"OPTIONS, POST" forKey: @"Public"];
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ ADDITIONAL_INCLUDE_DIRS += \
|
||||
-I../../SOPE
|
||||
|
||||
ADDITIONAL_LIB_DIRS += \
|
||||
-L../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo \
|
||||
-L../SoObjects/SOGo/SOGo.framework/ \
|
||||
-L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \
|
||||
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
|
||||
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
|
||||
-L/usr/local/lib \
|
||||
-Wl,-rpath,$(SOGO_SYSLIBDIR)/sogo
|
||||
-L/usr/local/lib
|
||||
|
||||
BUNDLE_LIBS += \
|
||||
-lSOGo \
|
||||
|
||||
@@ -40,7 +40,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
|
||||
#import <NGCards/iCalCalendar.h>
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
@@ -77,13 +76,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
NSMutableString *s;
|
||||
NSArray *attendees, *categories;
|
||||
NSArray *attendees;
|
||||
|
||||
iCalPerson *organizer, *attendee;
|
||||
iCalTimeZone *tz;
|
||||
id o;
|
||||
|
||||
int v, i, meetingStatus;
|
||||
int v;
|
||||
|
||||
NSTimeZone *userTimeZone;
|
||||
userTimeZone = [[[context activeUser] userDefaults] timeZone];
|
||||
@@ -128,14 +127,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
tz = [(iCalDateTime *)[self firstChildWithTag: @"dtstart"] timeZone];
|
||||
|
||||
if (!tz)
|
||||
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
|
||||
tz = [iCalTimeZone timeZoneForName: @"Europe/London"];
|
||||
|
||||
[s appendFormat: @"<TimeZone xmlns=\"Calendar:\">%@</TimeZone>", [tz activeSyncRepresentationInContext: context]];
|
||||
|
||||
// Organizer and other invitations related properties
|
||||
if ((organizer = [self organizer]))
|
||||
{
|
||||
meetingStatus = 1; // meeting and the user is the meeting organizer.
|
||||
o = [organizer rfc822Email];
|
||||
if ([o length])
|
||||
{
|
||||
@@ -161,7 +159,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendString: @"<Attendee xmlns=\"Calendar:\">"];
|
||||
|
||||
attendee = [attendees objectAtIndex: i];
|
||||
[s appendFormat: @"<Attendee_Email xmlns=\"Calendar:\">%@</Attendee_Email>", [[attendee rfc822Email] activeSyncRepresentationInContext: context]];
|
||||
[s appendFormat: @"<Attendee_Email xmlns=\"Calendar:\">%@</Attendee_Email>", [attendee rfc822Email]];
|
||||
[s appendFormat: @"<Attendee_Name xmlns=\"Calendar:\">%@</Attendee_Name>", [[attendee cn] activeSyncRepresentationInContext: context]];
|
||||
|
||||
attendee_status = [self _attendeeStatus: attendee];
|
||||
@@ -179,10 +177,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
[s appendString: @"</Attendees>"];
|
||||
}
|
||||
else
|
||||
{
|
||||
meetingStatus = 0; // appointment
|
||||
}
|
||||
|
||||
// This depends on the 'NEEDS-ACTION' parameter.
|
||||
// This will trigger the SendMail command
|
||||
@@ -192,21 +186,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
int attendee_status;
|
||||
|
||||
meetingStatus = 3; // event is a meeting, and the user is not the meeting organizer
|
||||
|
||||
attendee = [self userAsAttendee: [context activeUser]];
|
||||
attendee_status = [self _attendeeStatus: attendee];
|
||||
|
||||
[s appendFormat: @"<ResponseRequested xmlns=\"Calendar:\">%d</ResponseRequested>", 1];
|
||||
[s appendFormat: @"<ResponseType xmlns=\"Calendar:\">%d</ResponseType>", attendee_status];
|
||||
[s appendFormat: @"<MeetingStatus xmlns=\"Calendar:\">%d</MeetingStatus>", 3];
|
||||
[s appendFormat: @"<DisallowNewTimeProposal xmlns=\"Calendar:\">%d</DisallowNewTimeProposal>", 1];
|
||||
|
||||
// BusyStatus -- http://msdn.microsoft.com/en-us/library/ee202290(v=exchg.80).aspx
|
||||
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", 2];
|
||||
}
|
||||
|
||||
[s appendFormat: @"<MeetingStatus xmlns=\"Calendar:\">%d</MeetingStatus>", meetingStatus];
|
||||
|
||||
// Subject -- http://msdn.microsoft.com/en-us/library/ee157192(v=exchg.80).aspx
|
||||
if ([[self summary] length])
|
||||
[s appendFormat: @"<Subject xmlns=\"Calendar:\">%@</Subject>", [[self summary] activeSyncRepresentationInContext: context]];
|
||||
@@ -232,25 +223,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// Sensitivity
|
||||
if ([[self accessClass] isEqualToString: @"PRIVATE"])
|
||||
v = 2;
|
||||
else if ([[self accessClass] isEqualToString: @"CONFIDENTIAL"])
|
||||
if ([[self accessClass] isEqualToString: @"CONFIDENTIAL"])
|
||||
v = 3;
|
||||
else
|
||||
v = 0;
|
||||
|
||||
[s appendFormat: @"<Sensitivity xmlns=\"Calendar:\">%d</Sensitivity>", v];
|
||||
|
||||
categories = [self categories];
|
||||
|
||||
if ([categories count])
|
||||
{
|
||||
[s appendFormat: @"<Categories xmlns=\"Calendar:\">"];
|
||||
for (i = 0; i < [categories count]; i++)
|
||||
{
|
||||
[s appendFormat: @"<Category xmlns=\"Calendar:\">%@</Category>", [[categories objectAtIndex: i] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
[s appendFormat: @"</Categories>"];
|
||||
}
|
||||
|
||||
|
||||
// Reminder -- http://msdn.microsoft.com/en-us/library/ee219691(v=exchg.80).aspx
|
||||
// TODO: improve this to handle more alarm types
|
||||
@@ -258,7 +236,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
iCalAlarm *alarm;
|
||||
|
||||
alarm = [self firstDisplayOrAudioAlarm];
|
||||
alarm = [[self alarms] objectAtIndex: 0];
|
||||
[s appendString: [alarm activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
|
||||
@@ -272,23 +250,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
o = [self comment];
|
||||
if ([o length])
|
||||
{
|
||||
// It is very important here to NOT set <Truncated>0</Truncated> in the response,
|
||||
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
|
||||
o = [o activeSyncRepresentationInContext: context];
|
||||
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
[s appendFormat: @"<Body xmlns=\"Calendar:\">%@</Body>", o];
|
||||
[s appendString: @"<BodyTruncated xmlns=\"Calendar:\">0</BodyTruncated>"];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||
[s appendFormat: @"<Type>%d</Type>", 1];
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
|
||||
[s appendFormat: @"<Data>%@</Data>", o];
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||
[s appendFormat: @"<Type>%d</Type>", 1];
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
|
||||
[s appendFormat: @"<Truncated>%d</Truncated>", 0];
|
||||
[s appendFormat: @"<Data>%@</Data>", o];
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
|
||||
[s appendFormat: @"<NativeBodyType xmlns=\"AirSyncBase:\">%d</NativeBodyType>", 1];
|
||||
@@ -342,6 +310,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
iCalTimeZone *tz;
|
||||
id o;
|
||||
|
||||
NSInteger tzOffset;
|
||||
BOOL isAllDay;
|
||||
|
||||
if ((o = [theValues objectForKey: @"UID"]))
|
||||
@@ -365,10 +334,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[o intValue];
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
if ((o = [theValues objectForKey: @"MeetingStatus"]))
|
||||
{
|
||||
[o intValue];
|
||||
}
|
||||
|
||||
//
|
||||
// 0- normal, 1- personal, 2- private and 3-confidential
|
||||
//
|
||||
if ((o = [theValues objectForKey: @"Sensitivity"]))
|
||||
if ((o = [theValues objectForKey: @"Sensitivy"]))
|
||||
{
|
||||
switch ([o intValue])
|
||||
{
|
||||
@@ -385,36 +362,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
}
|
||||
|
||||
// Categories
|
||||
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
|
||||
[self setCategories: o];
|
||||
|
||||
// We ignore TimeZone sent by mobile devices for now.
|
||||
// Some Windows devices don't send during event updates.
|
||||
//if ((o = [theValues objectForKey: @"TimeZone"]))
|
||||
// {
|
||||
// }
|
||||
//else
|
||||
if ((o = [theValues objectForKey: @"TimeZone"]))
|
||||
{
|
||||
// We haven't received a timezone, let's use the user's timezone
|
||||
// specified in SOGo for now.
|
||||
// Ugh, we ignore it for now.
|
||||
userTimeZone = [[[context activeUser] userDefaults] timeZone];
|
||||
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
|
||||
[(iCalCalendar *) parent addTimeZone: tz];
|
||||
}
|
||||
|
||||
// FIXME: merge with iCalToDo
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
if ((o = [theValues objectForKey: @"Body"]))
|
||||
[self setComment: o];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
|
||||
[self setComment: o];
|
||||
}
|
||||
|
||||
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
|
||||
[self setComment: o];
|
||||
|
||||
if ((o = [theValues objectForKey: @"Location"]))
|
||||
[self setLocation: o];
|
||||
|
||||
@@ -424,13 +383,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
start = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"];
|
||||
[start setTimeZone: tz];
|
||||
|
||||
if (isAllDay)
|
||||
{
|
||||
if (isAllDay)
|
||||
{
|
||||
tzOffset = [userTimeZone secondsFromGMTForDate: o];
|
||||
o = [o dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
seconds: tzOffset];
|
||||
[start setDate: o];
|
||||
[start setTimeZone: nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
tzOffset = [userTimeZone secondsFromGMTForDate: o];
|
||||
o = [o dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
seconds: tzOffset];
|
||||
[start setDateTime: o];
|
||||
}
|
||||
}
|
||||
@@ -443,11 +410,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (isAllDay)
|
||||
{
|
||||
tzOffset = [userTimeZone secondsFromGMTForDate: o];
|
||||
o = [o dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
seconds: tzOffset];
|
||||
[end setDate: o];
|
||||
[end setTimeZone: nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
tzOffset = [userTimeZone secondsFromGMTForDate: o];
|
||||
o = [o dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
seconds: tzOffset];
|
||||
[end setDateTime: o];
|
||||
}
|
||||
}
|
||||
@@ -506,47 +481,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setOrganizer: person];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"MeetingStatus"]))
|
||||
{
|
||||
//
|
||||
// iOS is plain stupid here. It seends event invitations with no Organizer.
|
||||
// We check this corner-case and if MeetingStatus == 1 (see http://msdn.microsoft.com/en-us/library/ee219342(v=exchg.80).aspx or details)
|
||||
// and there's no organizer, we fake one.
|
||||
//
|
||||
if ([o intValue] == 1 && ![theValues objectForKey: @"Organizer_Email"] && ![[[self organizer] rfc822Email] length])
|
||||
{
|
||||
iCalPerson *person;
|
||||
|
||||
person = [iCalPerson elementWithTag: @"organizer"];
|
||||
[person setEmail: [[[context activeUser] primaryIdentity] objectForKey: @"email"]];
|
||||
[person setCn: [[context activeUser] cn]];
|
||||
[person setPartStat: @"ACCEPTED"];
|
||||
[self setOrganizer: person];
|
||||
}
|
||||
|
||||
//
|
||||
// When MeetingResponse fails Outlook still sends a new calendar entry with MeetingStatus=3.
|
||||
// Use the organizer from the request if the event has no organizer.
|
||||
//
|
||||
if ([o intValue] == 3 && [theValues objectForKey: @"Organizer_Email"] && ![[[self organizer] rfc822Email] length])
|
||||
{
|
||||
iCalPerson *person;
|
||||
person = [iCalPerson elementWithTag: @"organizer"];
|
||||
[person setEmail: [theValues objectForKey: @"Organizer_Email"]];
|
||||
[person setCn: [theValues objectForKey: @"Organizer_Name"]];
|
||||
[person setPartStat: @"ACCEPTED"];
|
||||
[self setOrganizer: person];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Attendees - we don't touch the values if we're an attendee. This is gonna
|
||||
// be done automatically by the ActiveSync client when invoking MeetingResponse.
|
||||
if (![self userIsAttendee: [context activeUser]])
|
||||
{
|
||||
// Windows phones sens sometimes an empty Attendees tag.
|
||||
// We check it's an array before processing it.
|
||||
if ((o = [theValues objectForKey: @"Attendees"])&& [o isKindOfClass: [NSArray class]])
|
||||
if ((o = [theValues objectForKey: @"Attendees"]))
|
||||
{
|
||||
NSMutableArray *attendees;
|
||||
NSDictionary *attendee;
|
||||
|
||||
@@ -76,17 +76,15 @@ struct SYSTEMTIME {
|
||||
byMonth = [rrule byMonth];
|
||||
if ([byMonth count] > 0)
|
||||
{
|
||||
tzData->wYear = 0;
|
||||
tzData->wMonth = [[byMonth objectAtIndex: 0] intValue];
|
||||
mask = [rrule byDayMask];
|
||||
tzData->wDayOfWeek = [mask firstDay];
|
||||
tzData->wDay = ([mask firstOccurrence] == -1) ? 5 : [mask firstOccurrence];
|
||||
tzData->wDay = [mask firstOccurrence];
|
||||
|
||||
dateValue = [self startDate];
|
||||
tzData->wHour = [dateValue hourOfDay];
|
||||
tzData->wMinute = [dateValue minuteOfHour];
|
||||
tzData->wSecond = [dateValue secondOfMinute];
|
||||
tzData->wMilliseconds = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
#import <NGObjWeb/WOContext.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
@@ -50,24 +49,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include "NSDate+ActiveSync.h"
|
||||
#include "NSString+ActiveSync.h"
|
||||
|
||||
|
||||
@implementation iCalToDo (ActiveSync)
|
||||
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
NSMutableString *s;
|
||||
NSArray *categories;
|
||||
id o;
|
||||
|
||||
int v, i;
|
||||
int v;
|
||||
|
||||
s = [NSMutableString string];
|
||||
|
||||
// Complete
|
||||
[s appendFormat: @"<Complete xmlns=\"Tasks:\">%d</Complete>", [[self status] isEqualToString: @"COMPLETED"] ? 1 : 0];
|
||||
o = [self completed];
|
||||
[s appendFormat: @"<Complete xmlns=\"Tasks:\">%d</Complete>", (o ? 1 : 0)];
|
||||
|
||||
// DateCompleted
|
||||
if ((o = [self completed]))
|
||||
if (o)
|
||||
[s appendFormat: @"<DateCompleted xmlns=\"Tasks:\">%@</DateCompleted>", [o activeSyncRepresentationInContext: context]];
|
||||
|
||||
// Start date
|
||||
@@ -98,28 +96,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// Reminder - FIXME
|
||||
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 0];
|
||||
|
||||
// Sensitivity
|
||||
if ([[self accessClass] isEqualToString: @"PRIVATE"])
|
||||
v = 2;
|
||||
else if ([[self accessClass] isEqualToString: @"CONFIDENTIAL"])
|
||||
v = 3;
|
||||
else
|
||||
v = 0;
|
||||
|
||||
[s appendFormat: @"<Sensitivity xmlns=\"Tasks:\">%d</Sensitivity>", v];
|
||||
|
||||
categories = [self categories];
|
||||
|
||||
if ([categories count])
|
||||
{
|
||||
[s appendFormat: @"<Categories xmlns=\"Tasks:\">"];
|
||||
for (i = 0; i < [categories count]; i++)
|
||||
{
|
||||
[s appendFormat: @"<Category xmlns=\"Tasks:\">%@</Category>", [[categories objectAtIndex: i] activeSyncRepresentationInContext: context]];
|
||||
}
|
||||
[s appendFormat: @"</Categories>"];
|
||||
}
|
||||
|
||||
// Sensitivity - FIXME
|
||||
[s appendFormat: @"<Sensitivity xmlns=\"Tasks:\">%d</Sensitivity>", 0];
|
||||
|
||||
// Subject
|
||||
o = [self summary];
|
||||
if ([o length])
|
||||
@@ -127,23 +106,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if ((o = [self comment]))
|
||||
{
|
||||
// It is very important here to NOT set <Truncated>0</Truncated> in the response,
|
||||
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
|
||||
o = [o activeSyncRepresentationInContext: context];
|
||||
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
[s appendFormat: @"<Body xmlns=\"Tasks:\">%@</Body>", o];
|
||||
[s appendString: @"<BodyTruncated xmlns=\"Tasks:\">0</BodyTruncated>"];
|
||||
}
|
||||
else
|
||||
{
|
||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||
[s appendFormat: @"<Type>%d</Type>", 1];
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
|
||||
[s appendFormat: @"<Data>%@</Data>", o];
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||
[s appendFormat: @"<Type>%d</Type>", 1];
|
||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
|
||||
[s appendFormat: @"<Truncated>%d</Truncated>", 0];
|
||||
[s appendFormat: @"<Data>%@</Data>", o];
|
||||
[s appendString: @"</Body>"];
|
||||
}
|
||||
|
||||
return s;
|
||||
@@ -156,6 +125,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
iCalTimeZone *tz;
|
||||
id o;
|
||||
|
||||
NSInteger tzOffset;
|
||||
|
||||
userTimeZone = [[[context activeUser] userDefaults] timeZone];
|
||||
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
|
||||
[(iCalCalendar *) parent addTimeZone: tz];
|
||||
@@ -165,16 +136,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setSummary: o];
|
||||
|
||||
// FIXME: merge with iCalEvent
|
||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||
{
|
||||
if ((o = [theValues objectForKey: @"Body"]))
|
||||
[self setComment: o];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
|
||||
[self setComment: o];
|
||||
}
|
||||
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
|
||||
[self setComment: o];
|
||||
|
||||
|
||||
if ([[theValues objectForKey: @"Complete"] intValue] &&
|
||||
((o = [theValues objectForKey: @"DateCompleted"])) )
|
||||
@@ -183,32 +147,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
o = [o calendarDate];
|
||||
completed = (iCalDateTime *) [self uniqueChildWithTag: @"completed"];
|
||||
//tzOffset = [[o timeZone] secondsFromGMTForDate: o];
|
||||
//o = [o dateByAddingYears: 0 months: 0 days: 0
|
||||
// hours: 0 minutes: 0
|
||||
// seconds: -tzOffset];
|
||||
[completed setDate: o];
|
||||
[self setStatus: @"COMPLETED"];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self setStatus: @"IN-PROCESS"];
|
||||
[self setCompleted: nil];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"DueDate"]))
|
||||
{
|
||||
iCalDateTime *due;
|
||||
|
||||
|
||||
o = [o calendarDate];
|
||||
due = (iCalDateTime *) [self uniqueChildWithTag: @"due"];
|
||||
[due setTimeZone: tz];
|
||||
[due setDateTime: o];
|
||||
}
|
||||
|
||||
if ((o = [theValues objectForKey: @"StartDate"]))
|
||||
{
|
||||
iCalDateTime *due;
|
||||
|
||||
o = [o calendarDate];
|
||||
due = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"];
|
||||
[due setTimeZone: tz];
|
||||
|
||||
tzOffset = [userTimeZone secondsFromGMTForDate: o];
|
||||
o = [o dateByAddingYears: 0 months: 0 days: 0
|
||||
hours: 0 minutes: 0
|
||||
seconds: tzOffset];
|
||||
[due setDateTime: o];
|
||||
}
|
||||
|
||||
@@ -223,29 +182,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[self setPriority: @"9"];
|
||||
}
|
||||
|
||||
//
|
||||
// 0- normal, 1- personal, 2- private and 3-confidential
|
||||
//
|
||||
if ((o = [theValues objectForKey: @"Sensitivity"]))
|
||||
{
|
||||
switch ([o intValue])
|
||||
{
|
||||
case 2:
|
||||
[self setAccessClass: @"PRIVATE"];
|
||||
break;
|
||||
case 3:
|
||||
[self setAccessClass: @"CONFIDENTIAL"];
|
||||
break;
|
||||
case 0:
|
||||
case 1:
|
||||
default:
|
||||
[self setAccessClass: @"PUBLIC"];
|
||||
}
|
||||
}
|
||||
|
||||
// Categories
|
||||
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
|
||||
[self setCategories: o];
|
||||
|
||||
if ((o = [theValues objectForKey: @"ReminderTime"]))
|
||||
{
|
||||
|
||||
@@ -28,13 +28,8 @@
|
||||
ProxyPass /SOGo http://127.0.0.1:20000/SOGo interpolate
|
||||
ProxyPass / http://127.0.0.1:20000/SOGo/dav/ interpolate
|
||||
<Location />
|
||||
<IfVersion < 2.4>
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
</IfVersion>
|
||||
<IfVersion >= 2.4>
|
||||
Require all granted
|
||||
</IfVersion>
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</Location>
|
||||
|
||||
<Proxy http://127.0.0.1:20000>
|
||||
|
||||
+3
-21
@@ -5,14 +5,8 @@ Alias /SOGo/WebServerResources/ \
|
||||
|
||||
<Directory /usr/lib/GNUstep/SOGo/>
|
||||
AllowOverride None
|
||||
|
||||
<IfVersion < 2.4>
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
</IfVersion>
|
||||
<IfVersion >= 2.4>
|
||||
Require all granted
|
||||
</IfVersion>
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
|
||||
# Explicitly allow caching of static content to avoid browser specific behavior.
|
||||
# A resource's URL MUST change in order to have the client load the new version.
|
||||
@@ -26,23 +20,12 @@ Alias /SOGo/WebServerResources/ \
|
||||
## need to set the "SOGoTrustProxyAuthentication" SOGo user default to YES and
|
||||
## adjust the "x-webobjects-remote-user" proxy header in the "Proxy" section
|
||||
## below.
|
||||
#
|
||||
## For full proxy-side authentication:
|
||||
#<Location /SOGo>
|
||||
# AuthType XXX
|
||||
# Require valid-user
|
||||
# SetEnv proxy-nokeepalive 1
|
||||
# Allow from all
|
||||
#</Location>
|
||||
#
|
||||
## For proxy-side authentication only for CardDAV and GroupDAV from external
|
||||
## clients:
|
||||
#<Location /SOGo/dav>
|
||||
# AuthType XXX
|
||||
# Require valid-user
|
||||
# SetEnv proxy-nokeepalive 1
|
||||
# Allow from all
|
||||
#</Location>
|
||||
|
||||
ProxyRequests Off
|
||||
SetEnv proxy-nokeepalive 1
|
||||
@@ -75,8 +58,7 @@ ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
|
||||
|
||||
## When using proxy-side autentication, you need to uncomment and
|
||||
## adjust the following line:
|
||||
RequestHeader unset "x-webobjects-remote-user"
|
||||
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" env=REMOTE_USER
|
||||
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e"
|
||||
|
||||
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
|
||||
|
||||
|
||||
+5655
File diff suppressed because it is too large.
Load diff
@@ -1,8 +0,0 @@
|
||||
all: $(patsubst %.asciidoc,%.pdf,$(wildcard *.asciidoc))
|
||||
|
||||
%.pdf : %.asciidoc
|
||||
asciidoc -a docinfo1 -b docbook -d book -o $<.docbook $<
|
||||
fop -c fonts/fop-config.xml -xsl docbook/xsl/sogo-fo.xsl -xml $<.docbook -pdf $@
|
||||
|
||||
clean:
|
||||
rm *.asciidoc.docbook *.pdf
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,157 +0,0 @@
|
||||
https://wiki.inverse.ca/focus/SOGo/CodingStyle
|
||||
https://wiki.inverse.ca/focus/SOGo/D%C3%A9veloppement
|
||||
https://wiki.inverse.ca/focus/PacketFence/Devel/BestPractices
|
||||
|
||||
UI and UX
|
||||
---------
|
||||
|
||||
* http://www.google.com/design/spec/material-design/
|
||||
* http://goodui.org/
|
||||
* Try Repeating Your Primary Action instead of showing it just once.
|
||||
* Try Distinct Clickable/Selected Styles instead of blurring them.
|
||||
* Try Undos instead of prompting for confirmation.
|
||||
* Try More Contrast instead of similarity.
|
||||
* Try Exposing Options instead of hiding them.
|
||||
* Try Showing State instead of being state agnostic.
|
||||
* Try Direct Manipulation instead of contextless menus.
|
||||
* Try Exposing Fields instead of creating extra pages.
|
||||
* Try Transitions instead of showing changes instantly.
|
||||
* Try Fewer Borders instead of wasting attention.
|
||||
* Try Designing For Zero Data instead of just data heavy cases.
|
||||
* Try Consistency instead of making people relearn.
|
||||
* Try Conventions instead of reinventing the wheel.
|
||||
* Try Visual Hierarchy instead of dullness.
|
||||
* Try Grouping Related Items instead of disordering.
|
||||
* Try Inline Validation instead of delaying errors.
|
||||
* Try Forgiving Inputs instead of being strict with data.
|
||||
* Try Bigger Click Areas instead of tiny ones.
|
||||
* Try Faster Load Times instead of making people wait.
|
||||
* Try Keyboard Shortcuts instead of buttons only.
|
||||
* Try Upfront Progress instead of starting with a blank.
|
||||
* Try Softer Prompts instead of modal windows.
|
||||
* Try Multifunctional Controls instead of more parts.
|
||||
* Try Icon Labels instead of opening for interpretation.
|
||||
* http://designmodo.com/create-style-guides/
|
||||
* http://uxmyths.com/
|
||||
|
||||
Frameworks & Tools
|
||||
------------------
|
||||
|
||||
GNUstep
|
||||
~~~~~~~
|
||||
|
||||
SOPE
|
||||
~~~~
|
||||
|
||||
AngularJS
|
||||
~~~~~~~~~
|
||||
|
||||
* https://angularjs.org/
|
||||
* http://angular-ui.github.io/ui-router/
|
||||
* https://www.airpair.com/angularjs/posts/angularjs-tutorial
|
||||
|
||||
Angular Material
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
* https://material.angularjs.org/
|
||||
|
||||
Lo-Dash
|
||||
~~~~~~~
|
||||
|
||||
* http://lodash.com/
|
||||
* http://underscorejs.org/
|
||||
|
||||
Code Style
|
||||
----------
|
||||
|
||||
Objective-C
|
||||
~~~~~~~~~~~
|
||||
|
||||
* To document the Web APIs, we follow the http://apidocjs.com/[APIDOC] standards.
|
||||
|
||||
apidoc -f ".*\\.m" -i UI -o Documentation/JSON-API
|
||||
|
||||
HTML
|
||||
~~~~
|
||||
|
||||
* Localize your strings:
|
||||
|
||||
<var:string label:value="I'm localized!"/>
|
||||
|
||||
* Localize your attributes:
|
||||
|
||||
<input type="text" label:placeholder="I'm localized!"/>
|
||||
|
||||
* Reuse existing localized strings as much as possible. Otherwise don't forget to update the English Localizable.strings file of the appropriate module.
|
||||
|
||||
JavaScript
|
||||
~~~~~~~~~~
|
||||
|
||||
* http://eslint.org/
|
||||
* https://github.com/toddmotto/angularjs-styleguide
|
||||
* https://github.com/angular/material/blob/master/docs/guides/CODING.md
|
||||
|
||||
* We conform to https://github.com/airbnb/javascript[Airbnb coding standards]. Use https://github.com/jscs-dev/node-jscs[jscs] with the 'airbnb' preset to validate your code style:
|
||||
|
||||
jscs -p airbnb *.js
|
||||
|
||||
* For documentation, we follow the http://usejsdoc.org/[JSDoc3] standards:
|
||||
|
||||
jsdoc UI/WebServerResources/js/{Appointments,Common,Contacts,Mailer}/*.js -d Documentation/JavaScript-API
|
||||
|
||||
Models (facades)
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
////
|
||||
http://trochette.github.io/Angular-Design-Patterns-Best-Practices/
|
||||
////
|
||||
* Move business logic into models and share them.
|
||||
* Keep it simple, separate server interaction and error handling from the model. That way model only handle data processing and code is easier to maintain.
|
||||
|
||||
SASS/CSS
|
||||
~~~~~~~~
|
||||
|
||||
* http://componentcss.com/
|
||||
* https://github.com/styleguide/css
|
||||
* https://smacss.com/
|
||||
|
||||
* For documentation, we follow http://sassdoc.com/[SassDoc] annotations.
|
||||
* We need the SASS files of Angular Material to build our CSS. The git repository of Angular Material is included as a submodule of SOGo:
|
||||
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
* FlexBox compatibility http://caniuse.com/#feat=flexbox
|
||||
|
||||
Fonts
|
||||
^^^^^
|
||||
|
||||
* We build a custom icons font using the online app https://icomoon.io/app/#/select[icomoon].
|
||||
* http://www.carrois.com/fira-4-0/
|
||||
* Material Design Iconic Font http://zavoloklom.github.io/material-design-iconic-font/icons.html
|
||||
|
||||
Version Control
|
||||
---------------
|
||||
|
||||
* https://devcharm.com/articles/46/improve-your-git-workflow/
|
||||
* Each commit should cover only one thing;
|
||||
* Begin the commit message with a single short (less than 50 characters) line summarizing the change, followed by a blank line and then a more thorough description;
|
||||
* When fixing a bug, commit to the devel branch as well as the maintenance branch of the latest release version (named maintenance/x.y). When a ticket is associated to the bug, add to the description a line saying *Fixes #1234*.
|
||||
* `git pull` may introduce http://stackoverflow.com/questions/15316601/in-what-cases-could-git-pull-be-harmful[inconsistencies and problems]. Replace it with the following alias:
|
||||
|
||||
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
* https://github.com/angular/protractor
|
||||
* http://karma-runner.github.io/
|
||||
|
||||
JSON API
|
||||
~~~~~~~~
|
||||
|
||||
One practical way to test the JSON API is to use `curl`. To do so, you need to enable `SOGoTrustProxyAuthentication` and configure HTTP authentifcation in Apache. You can pipe the result to [jq](http://stedolan.github.io/jq/) to nicely format and filter the output:
|
||||
|
||||
curl -u username:password http://localhost/SOGo/so/username/Calendar/calendarslist | jq '.'
|
||||
|
||||
curl -u username:password -H 'Content-Type: application/json' -d '{}' http://localhost/SOGo/so/francis/Calendar/personal/71B6-54904400-1-7C308500.ics/save
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,330 +0,0 @@
|
||||
Mobile Devices Configuration Guide
|
||||
==================================
|
||||
|
||||
////
|
||||
|
||||
This file is part of the SOGo project.
|
||||
|
||||
See SOGo Mobile Devices Configuration-docinfo.xml for authors,
|
||||
copyright and license information.
|
||||
|
||||
////
|
||||
|
||||
include::includes/global-attributes.asciidoc[]
|
||||
|
||||
About this Guide
|
||||
----------------
|
||||
|
||||
This guide will walk you through the installation and configuration of
|
||||
popular SyncML clients to be used with the SOGo solution.
|
||||
|
||||
This guide also include instructions for configuring Apple iPhone OS
|
||||
devices (iPhone, iPod touch, and iPad).
|
||||
|
||||
The instructions are based on version {release_version} of SOGo.
|
||||
|
||||
The latest version of this guide is available at
|
||||
http://www.sogo.nu/downloads/documentation.html.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
SOGo is a free and modern scalable groupware server. It offers shared
|
||||
calendars, address books, and emails through your favourite Web browser
|
||||
and by using a native client such as Mozilla Thunderbird and Lightning.
|
||||
|
||||
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
|
||||
and iTIP and reuses existing IMAP, SMTP and database servers - making
|
||||
the solution easy to deploy and interoperable with many applications.
|
||||
|
||||
SOGo features:
|
||||
|
||||
* Scalable architecture suitable for deployments from dozen to many
|
||||
thousand users
|
||||
* Rich Web-based interface that shares the look and feel, the features
|
||||
and the data of Mozilla Thunderbird and Lightning
|
||||
* Improved integration with Mozilla Thunderbird and Lighthing by using
|
||||
the SOGo Connector and the SOGo Integrator
|
||||
* Two-way synchronization support with any Microsoft ActiveSync-capable
|
||||
device, or Outlook 2013
|
||||
|
||||
SOGo is developed by a community of developers located mainly in North
|
||||
America and Europe. More information can be found on
|
||||
http://www.sogo.nu/.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
This section will guide you through the installation of popular SyncML
|
||||
clients on various devices.
|
||||
|
||||
Funambol SyncML Client
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The recommended SyncML client for BlackBerry, Apple iPhone (for
|
||||
contacts), mobile devices based on Microsoft Windows Mobile Smartphone
|
||||
or Windows Mobile PocketPC, is the one provided directly by Funambol,
|
||||
which is free and open source.
|
||||
|
||||
For Microsoft Window Mobile, you must identify which kind of device you
|
||||
have ("Smartphone" vs. "PocketPC").
|
||||
|
||||
Once you've identified what kind of device you have, download the
|
||||
appropriate client from:
|
||||
|
||||
http://www.funambol.com/opensource/downloads.php
|
||||
|
||||
The version 8.5 GA or later is required.
|
||||
|
||||
NextHaus SyncJe
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
For BlackBerry and Apple iPhone devices, you can also use the
|
||||
SyncJe SyncML client from NextHaus (http://www.nexthaus.com/). This
|
||||
client allows one to synchronize contacts, event and tasks with SOGo.
|
||||
|
||||
The version 2.43 or later is required. For BlackBerry 7XXX devices, the
|
||||
required version is 2.25 but isn't officially supported. You can install
|
||||
SyncJe on your BlackBerry device, over the air, by opening the following
|
||||
link from your BlackBerry device:
|
||||
|
||||
http://www.nexthaus.com/bb/syncjebb.jad
|
||||
|
||||
This will download and install the application on your mobile device.
|
||||
It's important to use the Web browser application and not the WAP
|
||||
browser to perform this operation. Once installed, restart the device.
|
||||
This procedure can also be used to update the SyncJe application. Note
|
||||
that an update of SyncJe will not affect the state of previous
|
||||
synchronizations. It's not necessary to perform a "slow sync" after an
|
||||
update of SyncJe.
|
||||
|
||||
Synthesis SyncML Client
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The Synthesis (http://www.synthesis.ch/) company provides a SyncML
|
||||
client for Palm OS-based devices.
|
||||
|
||||
"Over The Air" synchronization is possible, as well as synchronization
|
||||
through a cradle. For the latter, you must install Softick PPP using the
|
||||
Palm Desktop software. The version 3.01 or later is required and you can
|
||||
download it from http://www.softick.com/ppp/. Once installed, the
|
||||
desktop computer must be restarted.
|
||||
|
||||
Once completed, you must download the Synthesis client for Palm OS. The
|
||||
version 3.0.2.9 or later is required. Either the standard or the
|
||||
professional version can be used.
|
||||
|
||||
Once downloaded, uncompress the archive and install the `.prc` file on
|
||||
your Palm OS-based device. After, you should see a "SyncML" icon on your
|
||||
device.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
In this section, you'll learn how to configure the popular SyncML
|
||||
clients in order to fully synchronize your mobile device with SOGo.
|
||||
|
||||
Instructions for Apple iPhone OS based devices are also included. Note
|
||||
that those devices do not require a SyncML client for synchronizing
|
||||
calendars.
|
||||
|
||||
Funambol SyncML Client
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Once the Funambol SyncML client is installed, start the application from
|
||||
your mobile device to configure it using the following steps:
|
||||
|
||||
From the _Tools_ menu, choose _Options..._:
|
||||
|
||||
* Specify the _Location_. If your SOGo server is `sogo.domain.com`, the
|
||||
location should be `http://sogo.domain.com/funambol/ds`.
|
||||
* Specify your username and password
|
||||
* Check the _Contacts_ check box and click on the _Details_ button.
|
||||
The synchronization type is _two-way_ and the _Remote name_ is
|
||||
`sogo-card`. The data format is vCard.
|
||||
* Check the _Calendar_ check box and click on the _Details_ button. The
|
||||
synchronization type is _two-way_ and the _Remote name_ is `sogo-cal`.
|
||||
The data format is vCalendar.
|
||||
* Check the _Tasks_ check box and click on the _Details_ button. The
|
||||
synchronization type is _two-way_ and the _Remote name_ is
|
||||
`sogo-todo`. The data format is SIF.
|
||||
* Save the preferences.
|
||||
|
||||
To prevent the BlackBerry to automatically add a new event in the
|
||||
calendar when an invitation is received by email (IMIP message) on the
|
||||
BlackBerry device, you should delete the CICAL service from the Service
|
||||
Book. To do so, proceed with the following steps:
|
||||
|
||||
From the _Options_ menu:
|
||||
|
||||
* Choose _Advanced Options_
|
||||
* Choose _Service Book_
|
||||
* Identify the line that mentions the email address of the BlackBerry
|
||||
user followed by the `[CICAL]` string. For example, `user@domain.com
|
||||
[CICAL]`.
|
||||
* Delete this entry.
|
||||
|
||||
Once completed, you must restart the device by removing its battery for
|
||||
a couple of seconds. If you ever want to reactivate the CICAL service,
|
||||
follow those instructions:
|
||||
|
||||
http://support.appriver.com/KB/a205/how-to-resend-service-books-on-blackberry.aspx
|
||||
|
||||
Once complete, the client is ready for an initial synchronization.
|
||||
|
||||
Ideally, you should *delete* all data from the mobile device before the
|
||||
initial synchronization. To do so:
|
||||
|
||||
* From the _Tools_ menu, choose _Recover..._
|
||||
* Choose _Replace with data from server_
|
||||
* Check the _Contacts_, _Calendar_ and _Tasks_ check boxes
|
||||
|
||||
Finally, click on the _Sync All_ button to proceed with the
|
||||
synchronization.
|
||||
|
||||
NextHaus SyncJe
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Once NextHaus SyncJe is installed, proceed with the following steps,
|
||||
from your BlackBerry device, to configure it:
|
||||
|
||||
* Open the _SyncJe Client_
|
||||
|
||||
From the _Settings_ menu:
|
||||
|
||||
* Specify the _Server URL_. If your SOGo server is `sogo.domain.com`,
|
||||
the URL should be `http://sogo.domain.com/funambol/ds`.
|
||||
* Specify your user name and password
|
||||
* Check the _Contacts_ check box and specify `sogo-card` as the
|
||||
_Foldername_
|
||||
* Check the _Calendar_ check box and specify `sogo-cal` as the
|
||||
_Foldername_
|
||||
* Check the _ToDo_ check box and specify `sogo-todo` as the _Foldername_
|
||||
* Check the _Auto Sync_ check box if you wish to automatically
|
||||
synchronize contacts, events and tasks at a predefined time interval
|
||||
* Do *not* check the _Sync events between_ check box
|
||||
* Check the _Skip saving attendees_ - this will prevent the BlackBerry
|
||||
device from sending emails to meeting participants for events
|
||||
downloaded from the SOGo server
|
||||
* Check the _BIS_ check box (for _BlackBerry Internet Services_)
|
||||
* Leave the other fields to the their default value
|
||||
* Then choose _Save_ from the menu to save the preferences
|
||||
|
||||
To prevent the BlackBerry to automatically add a new event in the
|
||||
calendar when an invitation is received by email (IMIP message) on the
|
||||
BlackBerry device, you should delete the CICAL service from the Service
|
||||
Book. To do so, proceed with the following steps:
|
||||
|
||||
From the _Options_ menu:
|
||||
|
||||
* Choose _Advanced Options_
|
||||
* Choose _Service Book_
|
||||
* Identify the line that mentions the email address of the BlackBerry
|
||||
user followed by the `[CICAL]` string. For example, `user@domain.com
|
||||
[CICAL]`.
|
||||
* Delete this entry
|
||||
|
||||
Once completed, you must restart the device by removing its battery for
|
||||
a couple of seconds. If you ever want to reactivate the CICAL service,
|
||||
follow those instructions:
|
||||
|
||||
http://support.appriver.com/KB/a205/how-to-resend-service-books-on-blackberry.aspx
|
||||
|
||||
Once done, you're now ready for your first synchronization.
|
||||
|
||||
Ideally, you must delete all data on the BlackBerry before proceeding
|
||||
with the initial synchronization. To do so, proceed with the following
|
||||
steps:
|
||||
|
||||
* Open the _SyncJe Client_
|
||||
|
||||
From the _Settings_ menu:
|
||||
|
||||
* Choose the _Clear databases_ option
|
||||
* Respond _Yes_ to all questions. This will delete all contacts, events
|
||||
and tasks from your BlackBerry device.
|
||||
* Go back in the previous menu
|
||||
* Choose the _Force Slow Sync_ option
|
||||
* Choose the _Start Sync_ option to start the synchronization. This
|
||||
could take a few minutes if you have many contacts, events or tasks.
|
||||
Subsequent synchronizations should be much faster.
|
||||
|
||||
After the initial _Slow Sync_, you can simply chose the _Start Sync_
|
||||
option if you do a manual synchronization to synchronize all changes.
|
||||
|
||||
Synthesis SyncML Client
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Once the Synthesis SyncML client is installed, proceed with the
|
||||
following steps to configure it:
|
||||
|
||||
* Open the _Synthesis SyncML Standard Edition_ application
|
||||
|
||||
From the _Settings..._ menu:
|
||||
|
||||
* Specify the _Server URL_. If your SOGo server is `sogo.domain.com`,
|
||||
the URL should be `http://sogo.domain.com/funambol/ds`.
|
||||
* Specify your user name and password
|
||||
* Check the _Contacts_, _Events_ and _Task_ check boxes
|
||||
* Click on the _more..._ button
|
||||
* For the _Contacts_, choose _reload device_ and specify `sogo-card` as
|
||||
the _Server Path_.
|
||||
* For the _Events_, choose _reload device_ and specify `sogo-cal` as
|
||||
the _Server Path_. Do *not* check the _Only from..._ check box.
|
||||
* For the _Tasks_, choose _reload device_ and specify `sogo-todo` as
|
||||
the _Server Path_.
|
||||
* Once completed, click on the _Done_ button
|
||||
|
||||
The _reload device_ value will *delete* all entries on the device during
|
||||
the initial synchronization and obtain contacts, events and tasks from
|
||||
the server. If you do not want to delete everything from the device,
|
||||
please choose _normal_ instead of _reload device_.
|
||||
|
||||
Once ready, click on the _Start_ button to proceed with the initial
|
||||
synchronization.
|
||||
|
||||
During the initial synchronization, the Palm device will ask you how to
|
||||
connect to the desktop system. From the Palm device, choose _Windows
|
||||
RAS_ without specifying an user name or a password. This will allow the
|
||||
Palm device to establish a PPP connection between itself and Softick PPP
|
||||
and then communicate using its TCP/IP stack to the Funambol server.
|
||||
|
||||
Apple iOS — Calendars
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Starting from iOS 3, Apple has added CalDAV support to the calendar
|
||||
application included in the iPhone/iPod/iPad.
|
||||
|
||||
To add a CalDAV account, follow those instructions:
|
||||
|
||||
* From the _Settings_ menu, choose _Mail, Contacts, Calendars_
|
||||
* Choose _Add Account..._
|
||||
* Choose _Other_
|
||||
* Choose _Add CalDAV Account_
|
||||
* Specify the _Server_, the URL should be
|
||||
`http://sogo.domain.com/SOGo/dav/<username>`
|
||||
|
||||
On iOS 3.1.2 and later, you must also specify the range of events you
|
||||
want to have.
|
||||
|
||||
* From the _Settings_ menu, choose _Mail, Contacts, Calendars_
|
||||
* From the _Sync_ menu, choose _All Events_
|
||||
|
||||
Note that other options (_Events 2 Weeks Back_, etc.) do not work right
|
||||
now.
|
||||
|
||||
Apple iOS — Contacts
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you want to synchronize contacts with your Apple mobile device, use
|
||||
the native address book application with SOGo using the CardDAV
|
||||
protocol. To configure the address book application so it works with
|
||||
SOGo, create a new CardDAV account and specify your server name. In
|
||||
the _Advanced Settings_, set the port to `8800`.
|
||||
|
||||
On iOS prior to version 4, you must install the Funambol client and
|
||||
configure the `sogo-card` source.
|
||||
|
||||
include::includes/additional-info.asciidoc[]
|
||||
|
||||
include::includes/commercial-support.asciidoc[]
|
||||
@@ -1,358 +0,0 @@
|
||||
Mozilla Thunderbird Configuration Guide
|
||||
=======================================
|
||||
|
||||
////
|
||||
|
||||
This file is part of the SOGo project.
|
||||
|
||||
See SOGo Mozilla Thunderbird Configuration Guide-docinfo.xml for
|
||||
authors, copyright and license information.
|
||||
|
||||
////
|
||||
|
||||
include::includes/global-attributes.asciidoc[]
|
||||
|
||||
About this Guide
|
||||
----------------
|
||||
|
||||
This guide will walk you through the installation and configuration of
|
||||
Mozilla Thunderbird and its associated extensions so it can be used with
|
||||
the SOGo solution.
|
||||
|
||||
The instructions are based on version {release_version} of SOGo.
|
||||
|
||||
The latest version of this guide is available
|
||||
at http://www.sogo.nu/downloads/documentation.html.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
SOGo is a free and modern scalable groupware server. It offers shared
|
||||
calendars, address books, and emails through your favourite Web browser
|
||||
and by using a native client such as Mozilla Thunderbird and Lightning.
|
||||
|
||||
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
|
||||
and iTIP and reuses existing IMAP, SMTP and database servers - making
|
||||
the solution easy to deploy and interoperable with many applications.
|
||||
|
||||
SOGo features:
|
||||
|
||||
* Scalable architecture suitable for deployments from dozen to many
|
||||
thousand users
|
||||
* Rich Web-based interface that shares the look and feel, the features
|
||||
and the data of Mozilla Thunderbird and Lightning
|
||||
* Improved integration with Mozilla Thunderbird and Lightning by using
|
||||
the SOGo Connector and the SOGo Integrator extensions
|
||||
* Two-way synchronization support with any Microsoft ActiveSync-capable
|
||||
device, or Outlook 2013
|
||||
|
||||
SOGo is developed by a community of developers located mainly in North
|
||||
America and Europe. More information can be found on
|
||||
http://www.sogo.nu/.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
This section will guide you through the installation of Thunderbird and
|
||||
its associated extensions.
|
||||
|
||||
Mozilla Thunderbird
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Mozilla Thunderbird is the official front end client of SOGo.
|
||||
|
||||
Mozilla Thunderbird version 2, 3.1, 10 ESR (Extended Support Release),
|
||||
17 ESR, 24 and 31 are supported and it is recommended to use version 31 of
|
||||
Thunderbird.
|
||||
|
||||
In order to download and install Mozilla Thunderbird, please visit:
|
||||
|
||||
https://www.mozilla.org/en-US/thunderbird/organizations/all-esr.html
|
||||
|
||||
Mozilla Lightning
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
When using version 24 or 31 of Thunderbird, you can use the latest version of
|
||||
Mozilla Lightning. Use the Add-ons manager of Thunderbird or visit:
|
||||
|
||||
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/
|
||||
|
||||
When using version 17 ESR of Thunderbird, you can use Mozilla Lightning
|
||||
version 1.9.1. In order to download the extension, please visit:
|
||||
|
||||
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/versions/1.9.1
|
||||
|
||||
For Thunderbird 2 and 3.1, you need the _Inverse Edition_of Mozilla
|
||||
Lightning. It provides back ported features, bug fixes and security
|
||||
fixes from the current development version of Mozilla Lightning. For
|
||||
Thunderbird 2, it is based on release version 0.9 of Lightning. For
|
||||
Thunderbird 3.1, it is based on 1.0b2.
|
||||
|
||||
In order to download and install Mozilla Lightning – Inverse Edition for
|
||||
Thunderbird 2 or 3.1, please visit:
|
||||
|
||||
http://www.sogo.nu/downloads/frontends.html
|
||||
|
||||
SOGo Connector and SOGo Integrator
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The SOGo Connector and Integrator extensions are provided to perfect the
|
||||
integration of Mozilla Thunderbird 2, 3.1, 10 ESR, 17 ESR, 24 and 31 with
|
||||
the SOGo groupware solution.
|
||||
|
||||
First of all, the SOGo Connector extension transforms Thunderbird into a
|
||||
full DAV client for groupware servers such as SOGo, eGroupware or
|
||||
Citadel. It does this by adding support for remote DAV address books and
|
||||
by adding features to be used along with the Lightning calendar
|
||||
extension.
|
||||
|
||||
Among supported features of the SOGo Connector extension, we have:
|
||||
|
||||
* Free / Busy URL field in the address book
|
||||
* Free / Busy functionality through HTTP
|
||||
* Event organizers
|
||||
* Synchronization of the address book using GroupDAV
|
||||
* CardDAV implementation for the address book
|
||||
* Support for WebDAV ACL
|
||||
|
||||
On the other hand, the SOGo Integrator extension transforms Thunderbird
|
||||
into a pure "heavy" client for SOGo. Whereas the SOGo Connector is meant
|
||||
for portability (horizontal integration), the SOGo Integrator makes use
|
||||
of the features and layout only available from SOGo (vertical
|
||||
integration).
|
||||
|
||||
Among the supported features of the SOGo Integrator extension, we have :
|
||||
|
||||
* Remote administration of folder subscriptions
|
||||
* Remote administration of folder access control lists (ACL)
|
||||
* Automatic replication of your local and subscribed folders
|
||||
* When correctly configured, it handles the propagation of updates to
|
||||
chosen extensions from a local update server
|
||||
* Automatic propagation of default settings
|
||||
|
||||
In order to download and install the SOGo Connector and Integrator
|
||||
extensions, please visit:
|
||||
|
||||
http://www.sogo.nu/downloads/frontends.html
|
||||
|
||||
Prior to installing the SOGo Integrator extension, you should read the
|
||||
following chapter – _SOGo Integrator Customization_.
|
||||
|
||||
SOGo Integrator Customization
|
||||
-----------------------------
|
||||
|
||||
In this section, you'll learn how to customize the SOGo Integrator
|
||||
extension so it can be used alongside your SOGo server.
|
||||
|
||||
Customization
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The customization steps described here involves understanding of XML and
|
||||
of text file edition. If you do not have those skills, it is recommended
|
||||
that you don't try to use this extension.
|
||||
|
||||
There are actually two steps in the configuration of a working
|
||||
environment for SOGo Integrator. First of all, the Integrator will use
|
||||
the same user name used to connect to the first email server configured
|
||||
in Thunderbird. It is a current limitation but it will fit nearly all
|
||||
configurations out there.
|
||||
|
||||
For testing purpose, you are strongly recommended to create and
|
||||
configure an additional user profile for Thunderbird. This is for two
|
||||
reasons. The first is because of the limitation mentioned above. The
|
||||
second is because the Integrator will synchronize your personal address
|
||||
book onto the SOGo server and then remove it so that only your personal
|
||||
address book on SOGo will be available. If you are not able to do that,
|
||||
you may want to make a copy of that address book beforehand.
|
||||
|
||||
The second part requires editing one file in the extension file sub tree
|
||||
to specify where the SOGo server is located. This is done by hand. In an
|
||||
enterprise environment, this step is only required once per release
|
||||
since the updates are expected to propagate automatically.
|
||||
|
||||
Uncompress (using a ZIP or jar tool) the SOGo Integrator XPI and locate
|
||||
the following file:
|
||||
|
||||
extensions.rdf
|
||||
|
||||
This file is used for locating the extension update server and the SOGo
|
||||
server, which we consider to be the same for the moment. There is a line
|
||||
starting with a "Seq" tag and with an attribute named "isi:updateURL".
|
||||
Replace the host part of that url with the SOGo server you want to
|
||||
connect to.
|
||||
|
||||
For example, one would replace:
|
||||
|
||||
<Seq about="http://inverse.ca/sogo-integrator/extensions" isi:updateURL="http://sogo-demo.inverse.ca/plugins/updates.php?plugin=%ITEM_ID%&version=%ITEM_VERSION%&platform=%PLATFORM%">
|
||||
|
||||
by:
|
||||
|
||||
<Seq about="http://inverse.ca/sogo-integrator/extensions" isi:updateURL="https://sogo.acme.com/plugins/updates.php?plugin=%ITEM_ID%&version=%ITEM_VERSION%&platform=%PLATFORM%">
|
||||
|
||||
if the SOGo server is accessible from the following URL:
|
||||
|
||||
https://sogo.acme.com/SOGo
|
||||
|
||||
Note that if you changed the `x-webobjects-server-url` configuration
|
||||
setting from your HTTP server configuration file for SOGo, the
|
||||
value *must* match the one you specify in `isi:updateURL` – even the
|
||||
port number.
|
||||
|
||||
Moreover, you *must* change the value of the
|
||||
`sogo-integrator.autocomplete.server.urlid` preference from
|
||||
`defaults/preferences/site.js` to match the identifier of your
|
||||
_SOGoUserSources_. This source will be used by Thunderbird for
|
||||
autocompletion.
|
||||
|
||||
Once you're done modifying the configuration file, save your changes and
|
||||
reconstruct the XPI file.
|
||||
|
||||
Now start Thunderbird and install your newly modified extension.
|
||||
|
||||
SOGo Update Server
|
||||
------------------
|
||||
|
||||
In this section, you will learn how to install and configure the SOGo
|
||||
Update Server.
|
||||
|
||||
The SOGo Update Server can be used to automatically install or uninstall
|
||||
Mozilla Thunderbird extensions, push user settings and more – all from a
|
||||
central place managed by system administrators.
|
||||
|
||||
Installation
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Installation is relatively straightforward. You need to make
|
||||
the `updates.php` script available through your HTTP server at the URL
|
||||
you've specified from the `extensions.rdf` file. The `updates.php`
|
||||
script can be found in the SOGo sources, under the `Scripts` directory.
|
||||
|
||||
The `updateLink` section of the XML payload returned to sogo-integrator
|
||||
is built dynamically using the `SCRIPT_URI` variable, which is only
|
||||
available when running with mod_rewrite. It should work out of the box
|
||||
as long as the script is placed in the same directory as the xpi files.
|
||||
|
||||
If it is not the case, then the link should be adjusted to fit the
|
||||
actual file layout:
|
||||
|
||||
<em:updateLink><?php echo dirname(getenv('SCRIPT_URI')) . '/relative/path/to/' . $plugin["filename"] ?></em:updateLink>
|
||||
|
||||
An http request similar to the following can be used to make sure that
|
||||
the generated link is correct:
|
||||
|
||||
http://sogo.host/path/to/updates.php?plugin=sogo-integrator@inverse.ca&version=0.00
|
||||
|
||||
Please refer to your HTTP server documentation for the installation and
|
||||
configuration of PHP.
|
||||
|
||||
Configuration
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
To configure the SOGo update server, you need to modify the
|
||||
`updates.php` script directly.
|
||||
|
||||
Adding an extension to be pushed automatically by the update server
|
||||
require you to modify the `$plugins` array from updates.php and also
|
||||
adjust accordingly SOGo Integrator's `extensions.rdf` file.
|
||||
|
||||
For example, to automatically install SOGo Connector, SOGo Integrator
|
||||
and Lightning, you would have:
|
||||
|
||||
----
|
||||
$plugins
|
||||
= array( "sogo-connector@inverse.ca"
|
||||
=> array( "application" => "thunderbird",
|
||||
"version" => "31.0.0",
|
||||
"filename" => "sogo-connector-31.0.0.xpi" ),
|
||||
"sogo-integrator@inverse.ca"
|
||||
=> array( "application" => "thunderbird",
|
||||
"version" => "31.0.0",
|
||||
"filename" => "sogo-integrator-31.0.0-sogo-demo.xpi" ),
|
||||
"{e2fda1a4-762b-4020-b5ad-a41df1933103}"
|
||||
=> array( "application" => "thunderbird",
|
||||
"version" => "3.3.1",
|
||||
"filename" => "lightning.xpi" ));
|
||||
----
|
||||
|
||||
The syntax is:
|
||||
|
||||
----
|
||||
"<extension ID>"
|
||||
=> array( "application" => "thunderbird",
|
||||
"version" => "<exact version found in the extension's install.rdf file>",
|
||||
"filename" => "<exact filename on the filesystem>" )
|
||||
----
|
||||
|
||||
The path of the filename, specified in the `filename` parameter, is
|
||||
relative to the location of the `updates.php` script. For extensions
|
||||
that are dependant on the architecture and operating system (Microsoft
|
||||
Windows, Apple Mac OS X, etc.), they can be placed in subdirectories
|
||||
relative again to the `updates.php` script (but the filename must be
|
||||
identical in all subdirectories). For exemple, for Mozilla Lightning, we
|
||||
could have:
|
||||
|
||||
----
|
||||
Darwin_x86-gcc3/lightning.xpi
|
||||
Linux_x86-gcc3/lightning.xpi
|
||||
Linux_x86_64-gcc3/lightning.xpi
|
||||
WINNT_x86-msvc/lightning.xpi
|
||||
----
|
||||
|
||||
If you eventually want to disable an extension, that is, without
|
||||
removing it from your users' computers, you can specify `disabled` as
|
||||
the version number.
|
||||
|
||||
Next is to modify the `extensions.rdf` file. Again, to automatically
|
||||
install SOGo Connector, SOGo Integrator and Lightning, you would have:
|
||||
|
||||
----
|
||||
<li>
|
||||
<Description
|
||||
em:id="{e2fda1a4-762b-4020-b5ad-a41df1933103}"
|
||||
em:name="Lightning"/>
|
||||
</li>
|
||||
<li>
|
||||
<Description
|
||||
em:id="sogo-integrator@inverse.ca"
|
||||
em:name="SOGo Integrator"/>
|
||||
</li>
|
||||
<li>
|
||||
<Description
|
||||
em:id="sogo-connector@inverse.ca"
|
||||
em:name="SOGo Connector"/>
|
||||
</li>
|
||||
----
|
||||
|
||||
Using SOGo Integrator, you can also push user-settings for any part of
|
||||
Thunderbird or its extensions. There are two kind of user-settings
|
||||
push:
|
||||
|
||||
* Settings that are pushed during the initial configuration of
|
||||
Thunderbird
|
||||
* Settings that are pushed upon every restart (ie., forced) of
|
||||
Thunderbird
|
||||
|
||||
Settings that pushed are pushed during initial configuration are
|
||||
controlled by the `./defaults/preferences/site.js` file from SOGo
|
||||
Integrator. Here is an example:
|
||||
|
||||
----
|
||||
pref("calendar.alarms.showmissed", false);
|
||||
pref("calendar.caldav.sched.enabled", true);
|
||||
----
|
||||
|
||||
Preferences that are forced upon every restart of Thunderbird are
|
||||
controlled from the `./chrome/content/general/custom-preferences.js`
|
||||
configuration file.
|
||||
|
||||
Here is an example:
|
||||
|
||||
----
|
||||
force_int_pref("changequote.replyformat.format", 0);
|
||||
force_bool_pref("changequote.headers.withcc", true);
|
||||
force_char_pref(“foo.bar”, “zot”);
|
||||
----
|
||||
|
||||
include::includes/additional-info.asciidoc[]
|
||||
|
||||
include::includes/commercial-support.asciidoc[]
|
||||
@@ -1,872 +0,0 @@
|
||||
Native Microsoft Outlook Configuration Guide
|
||||
============================================
|
||||
|
||||
////
|
||||
|
||||
This file is part of the SOGo project.
|
||||
|
||||
See SOGo Native Microsoft Outlook Configuration-docinfo.xml for
|
||||
authors, copyright and license information.
|
||||
|
||||
////
|
||||
|
||||
include::includes/global-attributes.asciidoc[]
|
||||
|
||||
About this Guide
|
||||
----------------
|
||||
|
||||
This guide will walk you through the installation and configuration of
|
||||
the native Microsoft Outlook compatibility layer SOGo offers.
|
||||
|
||||
Prior going over this guide, you should have a working SOGo
|
||||
installation. Please refer to the _SOGo Installation and Configuration
|
||||
Guide_ for more information on installing and configuring SOGo.
|
||||
|
||||
This guide also includes instructions for configuring Microsoft Outlook
|
||||
with SOGo.
|
||||
|
||||
The instructions are based on version {release_version} of SOGo.
|
||||
|
||||
The latest version of this guide is available
|
||||
at http://www.sogo.nu/downloads/documentation.html.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
SOGo is a free and modern scalable groupware server. It offers shared
|
||||
calendars, address books, and emails through your favourite Web browser
|
||||
and by using a native client such as Mozilla Thunderbird and Lightning.
|
||||
|
||||
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
|
||||
and iTIP and reuses existing IMAP, SMTP and database servers — making
|
||||
the solution easy to deploy and interoperable with many applications.
|
||||
|
||||
SOGo features:
|
||||
|
||||
* Scalable architecture suitable for deployments from dozen to many
|
||||
thousand users
|
||||
* Rich Web-based interface that shares the look and feel, the features
|
||||
and the data of Mozilla Thunderbird and Lightning
|
||||
* Improved integration with Mozilla Thunderbird and Lightning by using
|
||||
the SOGo Connector and the SOGo Integrator
|
||||
* Native compatibility for Microsoft Outlook 2003, 2007, 2010, and 2013
|
||||
* Two-way synchronization support with any Microsoft ActiveSync-capable
|
||||
device, and Outlook 2013
|
||||
|
||||
SOGo is developed by a community of developers located mainly in North
|
||||
America and Europe. More information can be found
|
||||
on http://www.sogo.nu/.
|
||||
|
||||
Architecture
|
||||
------------
|
||||
|
||||
The following diagram demonstrates the architecture of the native
|
||||
Outlook compatibility layer of SOGo.
|
||||
|
||||
image::images/openchange.png[]
|
||||
|
||||
With Samba 4 and OpenChange, Microsoft Outlook clients can communicate
|
||||
natively with SOGo using the Microsoft Exchange protocol, without
|
||||
requiring costly and hard-to-maintain third-party MAPI connectors for
|
||||
Microsoft Outlook.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
Organizations generally have solutions to authenticate users such as
|
||||
LDAP servers or Microsoft Active Directory servers.
|
||||
|
||||
The solution being used will influence how users are provisioned in
|
||||
Samba 4, a key component for native Outlook compatibility in SOGo.
|
||||
|
||||
LDAP Server
|
||||
~~~~~~~~~~~
|
||||
|
||||
If your organization uses a LDAP server such OpenLDAP, Novell
|
||||
eDirectory, Apache Directory or any other solution, you must use
|
||||
Samba 4's internal directory server and synchronize the data between
|
||||
both.
|
||||
|
||||
Synchronization scripts are not provided and unless you have clear-text
|
||||
passwords of your existing users, they will have to be changed during
|
||||
your initial synchronization so that your LDAP's server passwords are
|
||||
identical to the ones from Samba 4.
|
||||
|
||||
Any modifications to your existing LDAP server (password change, user
|
||||
addition or deletion, etc.) will have to be replicated to Samba 4's
|
||||
internal directory server.
|
||||
|
||||
Note that if you install Samba 4 on a server that is already running a
|
||||
LDAP service, you will have to change to TCP port on which your LDAP
|
||||
server listens to. Samba 4 will use the TCP port 389 and it can't be
|
||||
changed.
|
||||
|
||||
For example, with OpenLDAP, you can use the `-h` parameter for `slapd`
|
||||
to make it listen on an other TCP port.
|
||||
|
||||
Microsoft Active Directory
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If your organization uses Microsoft Active Directory, Samba 4 will need
|
||||
to be joined to your Active Directory domain, as a DC.
|
||||
|
||||
Samba 4 will be able to reuse all the information contained in Microsoft
|
||||
Active Directory and no synchronization process needs to be put in place
|
||||
as information will get replicated to Samba 4 automatically.
|
||||
|
||||
For more information on joining Samba 4 to an existing Microsoft Active
|
||||
Directory domain, please refer to the Samba 4 documentation available at
|
||||
the following URL:
|
||||
|
||||
http://wiki.samba.org/index.php/Samba4
|
||||
|
||||
More specifically, have a look at the `samba-tool domain join` command.
|
||||
Note that joining Samba 4 to your Active Directory domain as a member
|
||||
will currently not work. An authentication bug is present in Samba 4
|
||||
which then prevents all Outlook users to successfully authenticate
|
||||
through Samba 4. This issue has been reported to the Samba team and is
|
||||
being worked on.
|
||||
|
||||
Other or No Solution
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If your organization neither uses a LDAP server or Microsoft Active
|
||||
Directory, you can start using Samba 4 as your directory server.
|
||||
|
||||
Samba 4's directory can be queried over LDAP just like Microsoft Active
|
||||
Directory and can also serve as a domain controller for Windows-based
|
||||
environments.
|
||||
|
||||
For example, SOGo can very well use Samba 4's built-in directory server
|
||||
to authenticate users. A SOGoUserSources entry to achieve this wold look
|
||||
like this:
|
||||
|
||||
----
|
||||
su – sogo
|
||||
defaults write sogod SOGoUserSources '(
|
||||
{
|
||||
CNFieldName = displayName;
|
||||
IDFieldName = cn;
|
||||
UIDFieldName = sAMAccountName;
|
||||
baseDN = "cn=Users,dc=example,dc=com";
|
||||
bindDN = "cn=Administrator,cn=Users,dc=example,dc=com";
|
||||
bindFields = (
|
||||
sAMAccountName
|
||||
);
|
||||
bindPassword = "%1OpenChange";
|
||||
canAuthenticate = YES;
|
||||
displayName = "Shared Addresses";
|
||||
hostname = "127.0.0.1";
|
||||
id = samba;
|
||||
isAddressBook = YES;
|
||||
port = 389;
|
||||
}
|
||||
)'
|
||||
----
|
||||
|
||||
Please refer to the _SOGo Installation and Configuration Guide_ for more
|
||||
information regarding `SOGoUserSources`.
|
||||
|
||||
IMAP Server and Trust
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
An IMAP server supporting the ACL, UIDPLUS and QRESYNC IMAP extensions
|
||||
is required, such as Cyrus IMAP version 2.4 or later, or Dovecot version
|
||||
2.1 or later. If your current IMAP server does not support these
|
||||
extensions, you can use Dovecot's proxying capabilities. The follow
|
||||
configuration example makes Dovecot proxy all IMAP request to an
|
||||
existing server:
|
||||
|
||||
----
|
||||
auth_mechanisms = plain login
|
||||
imapc_host = inverse.ca
|
||||
imapc_port = 993
|
||||
imapc_ssl = imaps
|
||||
imapc_ssl_verify = no
|
||||
mail_gid = imapproxy
|
||||
mail_home = /home/imapproxy/%u
|
||||
mail_location = imapc:~/imapc
|
||||
mail_uid = imapproxy
|
||||
passdb {
|
||||
args = host=inverse.ca ssl=imaps port=993 ssl_ca_dir=/etc/pki/tls/certs
|
||||
default_fields = userdb_imapc_user=%u userdb_imapc_password=%w
|
||||
driver = imap
|
||||
}
|
||||
protocols = imap
|
||||
ssl = no
|
||||
userdb {
|
||||
driver = prefetch
|
||||
}
|
||||
----
|
||||
|
||||
SOGo would then be configured to use Dovecot's proxy as the IMAP server.
|
||||
|
||||
Moreover, the authentication mode in use by Windows with Samba and
|
||||
Exchange servers prevent the backend from knowing the real password
|
||||
being used by the user. This implies that the IMAP server must accept
|
||||
any passwords from the host on which Samba is running.
|
||||
|
||||
To accomplish this with Cyrus IMAP Server, set `sasl_pwcheck_method`
|
||||
to `alwaystrue` in `/etc/imapd.conf`. You should restrain this to
|
||||
an `imapd` instance dedicated to SOGo.
|
||||
|
||||
For Dovecot, use an authentication source similar to:
|
||||
|
||||
----
|
||||
passdb {
|
||||
driver = static
|
||||
args = nopassword=y allow_nets=127.0.0.1/32
|
||||
}
|
||||
----
|
||||
|
||||
You should also make sure that you restrain this only to the SOGo
|
||||
processes.
|
||||
|
||||
For any other IMAP server, refer to the product's documentation. If such
|
||||
capability is not offered, you can alternatively define the cleartext
|
||||
password for each user. Please refer to the _Adding Users_ section from
|
||||
this document.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
This section will guide you through the installation of the native
|
||||
Microsoft Outlook compatibility layer SOGo offers.
|
||||
|
||||
Red Hat Enterprise Linux v6 x86_64
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you are using Red Hat Enterprise Linux version 6 x86_64, packages
|
||||
for Samba 4, OpenChange and SOGo and the SOGo OpenChange backend are
|
||||
available from SOGo's web site. Please follow the instructions from
|
||||
http://www.sogo.nu/english/downloads/backend.html.
|
||||
|
||||
In order to satisfy certain dependencies, you should also add the EPEL
|
||||
source corresponding to your distribution and architecture. More
|
||||
information on this is available here:
|
||||
http://fedoraproject.org/wiki/EPEL – or more specifically,
|
||||
http://fedoraproject.org/wiki/EPEL/FAQ#How_can_I_install_the_packages_from_the_EPEL_software_repository.3F.
|
||||
|
||||
Once ready, install the OpenChange packages on top of an existing SOGo
|
||||
installation:
|
||||
|
||||
----
|
||||
yum clean all && yum makecache
|
||||
yum install samba \
|
||||
openchange \
|
||||
sogo-openchange-backend \
|
||||
openchange-ocsmanager \
|
||||
openchange-rpcproxy \
|
||||
mysql-server \
|
||||
MySQL-python
|
||||
----
|
||||
|
||||
Once the packages are installed, refer to the _Configuration_ chapter
|
||||
from this guide.
|
||||
|
||||
[NOTE]
|
||||
Samba4/OpenChange are not available for now on CentOS 5 i386/x86_64,
|
||||
and CentOS 7. On Debian-based systems, packages are available only on
|
||||
the x86_64 platform.
|
||||
|
||||
Debian 7 (Wheezy) and Ubuntu 12.04 (Precise Pangolin)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
SOGo, OpenChange and the SOGo OpenChange backend are now
|
||||
available from SOGo's web site. Please follow the instructions from
|
||||
http://www.sogo.nu/english/downloads/backend.html to setup your
|
||||
apt sources.
|
||||
|
||||
On Debian7, for some Samba 4 dependencies, you need to use the
|
||||
_wheezy-backports_ repository. To do so, create
|
||||
`/etc/apt/sources.list.d/backports.list` with the following
|
||||
content:
|
||||
|
||||
deb http://http.debian.net/debian wheezy-backports main
|
||||
|
||||
Then install Samba 4 on top of an existing SOGo
|
||||
installation:
|
||||
|
||||
----
|
||||
apt-get update
|
||||
apt-get install samba samba-dev
|
||||
----
|
||||
|
||||
Once completed, install the packages related to OpenChange and the SOGo
|
||||
provider:
|
||||
|
||||
----
|
||||
apt-get install openchangeserver \
|
||||
sogo-openchange \
|
||||
openchangeproxy \
|
||||
python-ocsmanager \
|
||||
mysql-server \
|
||||
python-mysqldb \
|
||||
openchange-ocsmanager \
|
||||
openchange-rpcproxy \
|
||||
python-sievelib \
|
||||
python-spyne \
|
||||
python-rpclib
|
||||
----
|
||||
|
||||
Once the packages are installed, refer to the _Configuration_ chapter
|
||||
from this guide.
|
||||
|
||||
[NOTE]
|
||||
On Ubuntu 12.04, the Samba init scripts need to be modified to
|
||||
disable the upstart check. For more details, refer to:
|
||||
https://wiki.samba.org/index.php/Samba4/InitScript
|
||||
|
||||
|
||||
Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Please follow the instructions from
|
||||
http://www.sogo.nu/english/downloads/backend.html to setup your
|
||||
apt sources.
|
||||
|
||||
Then install Samba 4 on top of an existing SOGo
|
||||
installation:
|
||||
|
||||
----
|
||||
apt-get update
|
||||
apt-get install samba samba-dev
|
||||
----
|
||||
|
||||
Once completed, install the packages related to OpenChange and the SOGo
|
||||
provider:
|
||||
|
||||
----
|
||||
apt-get install openchangeserver \
|
||||
sogo-openchange \
|
||||
openchangeproxy \
|
||||
python-ocsmanager \
|
||||
mysql-server \
|
||||
python-mysqldb \
|
||||
openchange-ocsmanager \
|
||||
openchange-rpcproxy \
|
||||
python-sievelib \
|
||||
python-spyne \
|
||||
python-rpclib
|
||||
----
|
||||
|
||||
Once the packages are installed, refer to the _Configuration_ chapter
|
||||
from this guide.
|
||||
|
||||
[NOTE]
|
||||
The `ocsmanager.conf` and `rpcproxy.conf` are currently located in
|
||||
`/etc/apache2/conf.d`. These should be moved to `/etc/apache2/conf-available`.
|
||||
This is a packaging error that will soon be fixed.
|
||||
|
||||
[NOTE]
|
||||
You might have to adjust the `rpcproxy.conf` configuration file to add the
|
||||
`Require all granted` permission if you get Apache errors such as
|
||||
`client denied by server configuration`.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
In this section, you'll learn how to configure the native Microsoft
|
||||
Outlook compatibility layer that SOGo offers.
|
||||
|
||||
SOGo Configuration
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
First thing to do is to configure SOGo to use your current services,
|
||||
which are your IMAP, SMTP and SQL database servers. The configuration
|
||||
instructions for this are available in the SOGo Installation and
|
||||
Configuration Guide available from http://www.sogo.nu/.
|
||||
|
||||
Please refer to that documentation before continuing with the
|
||||
instructions included in this guide.
|
||||
|
||||
Samba 4 Configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Run the following commands as root:
|
||||
|
||||
----
|
||||
samba-tool domain provision --realm=example.com \
|
||||
--domain=OPENCHANGE \
|
||||
--adminpass='%1OpenChange' \
|
||||
--server-role='domain controller'
|
||||
|
||||
samba-tool user setexpiry administrator --noexpiry
|
||||
----
|
||||
|
||||
You might consider changing the realm and domain used, to suit your
|
||||
enviroment.
|
||||
|
||||
You might also have to
|
||||
remove `/etc/samba/smb.conf` prior running this command.
|
||||
|
||||
Add the following parameters to the `[global]` section of the
|
||||
`/etc/samba/smb.conf` configuration file:
|
||||
|
||||
----
|
||||
### Configuration required by OpenChange server ###
|
||||
dsdb:schema update allowed = true
|
||||
dcerpc endpoint servers = epmapper, mapiproxy, dnsserver
|
||||
dcerpc_mapiproxy:server = true
|
||||
dcerpc_mapiproxy:interfaces = exchange_emsmdb, exchange_nsp, exchange_ds_rfr
|
||||
### Configuration required by OpenChange server ###
|
||||
----
|
||||
|
||||
Your Samba 4 configuration file should look like this:
|
||||
|
||||
----
|
||||
# Global parameters
|
||||
[global]
|
||||
server role = active directory domain controller
|
||||
workgroup = EXAMPLE
|
||||
realm = example.com
|
||||
netbios name = sogo
|
||||
passdb backend = samba4
|
||||
### Configuration required by OpenChange server ###
|
||||
dsdb:schema update allowed = true
|
||||
dcerpc endpoint servers = +epmapper, +mapiproxy
|
||||
dcerpc_mapiproxy:server = true
|
||||
dcerpc_mapiproxy:interfaces = exchange_emsmdb, exchange_nsp, exchange_ds_rfr
|
||||
### Configuration required by OpenChange server ###
|
||||
|
||||
[netlogon]
|
||||
path = /var/lib/samba/sysvol/example.com/scripts
|
||||
read only = No
|
||||
|
||||
[sysvol]
|
||||
path = /var/lib/samba/sysvol
|
||||
read only = No
|
||||
----
|
||||
|
||||
OpenChange Configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
OpenChange 2.2 stores its metadata in MySQL so you need to have it installed.
|
||||
|
||||
First, create the OpenChange MySQL user:
|
||||
|
||||
----
|
||||
$ mysql -u root -p
|
||||
mysql> CREATE USER 'openchange-user'@'localhost' IDENTIFIED BY 'openchange$123';
|
||||
mysql> GRANT ALL PRIVILEGES ON `openchange`.* TO 'openchange-user'@'localhost' WITH GRANT OPTION;
|
||||
mysql> FLUSH PRIVILEGES;
|
||||
----
|
||||
|
||||
The Samba AD schema needs to be filled with additional object
|
||||
definitions by running the following commands:
|
||||
|
||||
----
|
||||
openchange_provision --standalone
|
||||
|
||||
NOTE: This operation can take several minutes
|
||||
[+] Step 1: Register Exchange OIDs
|
||||
[+] Step 2: Add Exchange attributes to Samba schema
|
||||
[+] Step 3: Add Exchange auxiliary classes to Samba schema
|
||||
[+] Step 4: Add Exchange objectCategory to Samba schema
|
||||
[+] Step 5: Add Exchange containers to Samba schema
|
||||
[+] Step 6: Add Exchange *sub* containers to Samba schema
|
||||
[+] Step 7: Add Exchange CfgProtocol subcontainers to Samba schema
|
||||
[+] Step 8: Add Exchange mailGateway subcontainers to Samba schema
|
||||
[+] Step 9: Add Exchange classes to Samba schema
|
||||
[+] Step 10: Add possSuperior attributes to Exchange classes
|
||||
[+] Step 11: Extend existing Samba classes and attributes
|
||||
[+] Step 12: Generic Exchange configuration objects
|
||||
[+] Step 13: Finalize generic Exchange configuration objects
|
||||
[SUCCESS] Done!
|
||||
[+] Step 1: Exchange Samba registration
|
||||
[SUCCESS] Done!
|
||||
[+] Step 1: Register Exchange Samba as the main server
|
||||
[SUCCESS] Done!
|
||||
----
|
||||
|
||||
Create the OpenChange database:
|
||||
|
||||
----
|
||||
openchange_provision --openchangedb --openchangedb-uri 'mysql://openchange-user:openchange$123@localhost/openchange'
|
||||
|
||||
Setting up openchange db
|
||||
[+] Public Folders
|
||||
===================
|
||||
* Public Folder Root : 0x0100000000000001 (72057594037927937)
|
||||
* IPM_SUBTREE : 0x0200000000000001 (144115188075855873)
|
||||
* NON_IPM_SUBTREE : 0x0300000000000001 (216172782113783809)
|
||||
* EFORMS REGISTRY : 0x0400000000000001 (288230376151711745)
|
||||
* OFFLINE ADDRESS BOOK : 0x0500000000000001 (360287970189639681)
|
||||
* /o=First Organization/cn=addrlists/cn=oabs/cn=Default Offline Address Book: 0x0600000000000001 (432345564227567617)
|
||||
* SCHEDULE+ FREE BUSY : 0x0700000000000001 (504403158265495553)
|
||||
* EX:/o=first organization/ou=first administrative group: 0x0800000000000001 (576460752303423489)
|
||||
* Events Root : 0x0900000000000001 (648518346341351425)
|
||||
----
|
||||
|
||||
Finally, modify `/etc/samba/smb.conf` to specify OpenChange connection information
|
||||
for its indexing database. Add the following at the end of the `[global]` section:
|
||||
|
||||
----
|
||||
mapistore:namedproperties = mysql
|
||||
namedproperties:mysql_user = openchange-user
|
||||
namedproperties:mysql_pass = openchange$123
|
||||
namedproperties:mysql_host = localhost
|
||||
namedproperties:mysql_db = openchange
|
||||
|
||||
mapistore:indexing_backend = mysql://openchange-user:openchange$123@localhost/openchange
|
||||
mapiproxy:openchangedb = mysql://openchange-user:openchange$123@localhost/openchange
|
||||
----
|
||||
|
||||
On RHEL, make sure SELinux is disabled:
|
||||
|
||||
setenforce 0
|
||||
|
||||
Next, you can start Samba using the usual command:
|
||||
|
||||
/etc/init.d/samba start
|
||||
|
||||
On upstart-based distributions, use:
|
||||
|
||||
start samba-ad-dc
|
||||
|
||||
You can also launch the OpenChange web services:
|
||||
|
||||
/etc/init.d/openchange-ocsmanager start
|
||||
|
||||
Apache Configuration for Web Services
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The OpenChange web services consist of two components:
|
||||
|
||||
1. *OCS Manager* which is used for autodiscovery and freebusy lookups on
|
||||
Outlook 2007 and 2010. This service runs in its own application server
|
||||
which listens on `127.0.0.1:5000` by default. Apache needs to be
|
||||
configured to forward certain requests to it to make it accessible from
|
||||
the outside.
|
||||
Note that this service *MUST* be accessible over*HTTPS*, otherwise Outlook
|
||||
won't use it.
|
||||
2. *RPC Proxy* which is used for RPC over HTTP ("Outlook Anywhere").
|
||||
This service runs as a WSGI application under apache (mod_wsgi).
|
||||
While HTTPS is not required to access this service, it is strongly
|
||||
recommended.
|
||||
|
||||
On RHEL-based distributions, the apache configuration required by these
|
||||
services can be found in `/etc/httpd/conf.d/ocsmanager.conf` and
|
||||
`/etc/httpd/conf.d/rpcproxy.conf`.
|
||||
|
||||
For Debian-based distributions, these files can be found
|
||||
in `/etc/apache2/conf.d/` or `/etc/apache2/conf-available`.
|
||||
|
||||
The configuration requires three Apache modules: _mod_proxy_,
|
||||
_mod_proxy_http_ and _mod_wsgi_. These are usually already installed but
|
||||
might need to be activated on Debian-based installations:
|
||||
|
||||
a2enmod proxy proxy_http wsgi
|
||||
|
||||
The OCS Manager and RPC Proxy configuration module can be enabled using:
|
||||
|
||||
a2enconf ocsmanager
|
||||
a2enconf rpcproxy
|
||||
|
||||
On RHEL-based distributions, make sure the `LoadModule` directive is
|
||||
uncommented in `/etc/httpd/conf.d/wsgi.conf`.
|
||||
|
||||
The _reqtimeout_ apache module is known to cause problems when using the
|
||||
default configuration shipped with Debian-based systems. On such
|
||||
distributions, Apache will close (HTTP/1.1 500) any HTTP request for
|
||||
which the HTTP body hasn't arrived in 10 seconds.
|
||||
|
||||
While this is arguably good practice with regular HTTP, it will disrupt
|
||||
the RPC over HTTP protocol implemented by RPC Proxy: Outlook will
|
||||
continuously disconnect and reconnect leading to suboptimal performance.
|
||||
|
||||
To avoid this problem, use a much higher timeout or disable the module:
|
||||
|
||||
a2dismod reqtimeout
|
||||
|
||||
You should now restart the Apache service and make sure it will start on
|
||||
boot. On RHEL-based distributions, do:
|
||||
|
||||
chkconfig httpd on && /etc/init.d/httpd restart
|
||||
|
||||
On Debian-based distributions, do:
|
||||
|
||||
update-rc.d apache2 defaults && /etc/init.d/apache2 restart
|
||||
|
||||
Finally, you must adjust the OCS Manager configuration file, which is
|
||||
located in `/etc/ocsmanager/ocsmanager.ini`. You should enable LDAP-based
|
||||
authentication in the `main` section and configure it accordingly. You should
|
||||
also enable rpcproxy. You file should be similar to this one:
|
||||
|
||||
----
|
||||
[DEFAULT]
|
||||
debug = true
|
||||
email_to = you@yourdomain.com
|
||||
smtp_server = localhost
|
||||
error_email_from = paste@localhost
|
||||
|
||||
[main]
|
||||
auth = ldap
|
||||
mapistore_root = /var/lib/samba/private
|
||||
mapistore_data = /var/lib/samba/private/mapistore
|
||||
debug = yes
|
||||
|
||||
[auth:file]
|
||||
|
||||
[auth:ldap]
|
||||
host = ldap://127.0.0.1
|
||||
port = 389
|
||||
bind_dn = cn=administrator,cn=Users,dc=example,dc=com
|
||||
bind_pw = %1OpenChange
|
||||
basedn = cn=Users,dc=example,dc=com
|
||||
|
||||
[auth:single]
|
||||
username = openchange
|
||||
password = {SSHA}I6Hy5Wv0wuxyXvMBFWFQDVVN12_CLaX9
|
||||
|
||||
[server:main]
|
||||
use = egg:Paste#http
|
||||
host = 127.0.0.1
|
||||
port = 5000
|
||||
protocol_version = HTTP/1.1
|
||||
|
||||
[app:main]
|
||||
use = egg:ocsmanager
|
||||
full_stack = true
|
||||
static_files = true
|
||||
cache_dir = %(here)s/data
|
||||
beaker.session.key = ocsmanager
|
||||
beaker.session.secret = SDyKK3dKyDgW0mlpqttTMGU1f
|
||||
app_instance_uuid = {ee533ebc-f266-49d1-ae10-d017ee6aa98c}
|
||||
NTLMAUTHHANDLER_WORKDIR = /var/cache/ntlmauthhandler
|
||||
SAMBA_HOST = 127.0.0.1
|
||||
|
||||
[rpcproxy:ldap]
|
||||
host = localhost
|
||||
port = 389
|
||||
basedn = CN=Users,DC=example,DC=com
|
||||
set debug = true
|
||||
----
|
||||
|
||||
----
|
||||
[autodiscover]
|
||||
|
||||
[autodiscover:rpcproxy]
|
||||
enabled = true
|
||||
|
||||
[outofoffice]
|
||||
|
||||
[outofoffice:file]
|
||||
sieve_script_path = /var/vmail/$domain/$user/sieve-script
|
||||
sieve_script_path_mkdir = false
|
||||
|
||||
[outofoffice:managesieve]
|
||||
secret = secret
|
||||
|
||||
[loggers]
|
||||
keys = root
|
||||
|
||||
[handlers]
|
||||
keys = console
|
||||
|
||||
[formatters]
|
||||
keys = generic
|
||||
|
||||
[logger_root]
|
||||
level = INFO
|
||||
handlers = console
|
||||
|
||||
[handler_console]
|
||||
class = StreamHandler
|
||||
args = (sys.stderr,)
|
||||
level = NOTSET
|
||||
formatter = generic
|
||||
|
||||
[formatter_generic]
|
||||
format = %(asctime)s %(levelname)-5.5s [%(name)s] [%(threadName)s] %(message)s
|
||||
----
|
||||
|
||||
Once completed, start the OCS Manager service:
|
||||
|
||||
/etc/init.d/openchange-ocsmanager start
|
||||
|
||||
Name Service Configuration for Web Services
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The autodiscovery service must be made accessible in order to advertise
|
||||
the web services provided by OpenChange. This can be done in two ways.
|
||||
|
||||
1. The first is to associate the FQDN `autodiscover.example.com.` with
|
||||
the machine that hosts Samba 4 / OpenChange, by adding a `CNAME` entry
|
||||
in your DNS configuration. Note that, instead or changing your DNS
|
||||
server configuration, you can simply add a similar entry to the _hosts_
|
||||
file of the Windows machine from where you'll run Outlook, which is
|
||||
handy for testing purposes.
|
||||
2. The second option is to add a `SRV` entry to your DNS configuration
|
||||
where the `_service` value would be `Autodiscover` and the `_protocol`
|
||||
would be `_tcp`.
|
||||
|
||||
For example:
|
||||
|
||||
_autodiscover._tcp.example.com. IN SRV 0 0 443 sogo.example.com.
|
||||
|
||||
Again, the autodiscovery service must be accessible over HTTPS.
|
||||
|
||||
Adding Users
|
||||
------------
|
||||
|
||||
Users that wish to connect natively to SOGo must be provisioned in
|
||||
Samba 4 and in OpenChange – even if they already exist in your current
|
||||
LDAP or Microsoft Active Directory server.
|
||||
|
||||
To add a user, execute the following commands:
|
||||
|
||||
----
|
||||
# add user to samba
|
||||
samba-tool domain passwordsettings set --complexity=off
|
||||
samba-tool domain passwordsettings set --min-pwd-length=1
|
||||
samba-tool user add <username>
|
||||
samba-tool user setexpiry <username> --noexpiry
|
||||
# create user in openchange
|
||||
openchange_newuser --create <username>
|
||||
----
|
||||
|
||||
If you don't have a trust between your IMAP server and SOGo, you must at
|
||||
this point set the cleartext password of the newly created user in
|
||||
`/var/lib/samba/private/mapistore/<username/password`.
|
||||
|
||||
This per-user file contains the cleartext password of the user as a
|
||||
UTF-8 string, on a single line. This password will be used to
|
||||
authenticate SOGo/OpenChange storage provider to your IMAP server.
|
||||
|
||||
Microsoft Outlook Configuration
|
||||
-------------------------------
|
||||
|
||||
To connect Microsoft Outlook, you can either use the IP address of the
|
||||
server or its DNS name. If you prefer using the DNS name, add an entry
|
||||
like the following to the `c:\windows\system32\drivers\etc\hosts` file
|
||||
in order to associate the IP address with the right DNS names:
|
||||
|
||||
192.168.1.1 sogo.example.com autodiscover.example.com
|
||||
|
||||
Next, you must configure Microsoft Outlook.
|
||||
|
||||
* Open the Control Panel => Mail => Email Accounts.
|
||||
* Select _Add a new e-mail account_
|
||||
* Choose _Microsoft Exchange Server_
|
||||
* Fill the required information. Enter the DNS name or the IP address of
|
||||
your SOGo server in the _Microsoft Exchange Server_ field
|
||||
* Leave the _Use Cached Exchange Mode_ checkbox enabled
|
||||
* Enter your username in the _User Name_ field
|
||||
* Click on _More Settings_ and ignore the warning, if any, about
|
||||
Exchange being offline by clicking on Cancel
|
||||
* From the Security tab, enable Always prompt for user name and password
|
||||
* From the _Connection_ tab, enable _"Outlook Anywhere"_ if you plan to
|
||||
use Outlook outside of your LAN. Moreover, click on the _Exchange Proxy
|
||||
Settings..._ button to enable it for slow and fast networks. Specify
|
||||
also the host, which should be the same value you specified in the
|
||||
Microsoft Exchange Server field.
|
||||
* Finally, click on Check Name and confirm your username and password
|
||||
|
||||
Start Microsoft Outlook and enter your username and password. It will
|
||||
start to synchronize your mailbox. This could take a long time if you
|
||||
have many emails, events, tasks and contacts. Once this step is
|
||||
completed, check the autodiscovery service with Outlook 2007 or 2010 by
|
||||
simultaneously holding the CTRL key on your keyboard and right-clicking
|
||||
on the Outlook icon in the notification toolbar. A special entry named
|
||||
"Test E-mail AutoConfiguration..." will appear and will enable you to
|
||||
check the service.
|
||||
|
||||
Known Issues or Limitations
|
||||
---------------------------
|
||||
|
||||
* Make sure you periodically backup all your data regarding SOGo.
|
||||
* Make sure you have no firewalls activated between your Microsoft
|
||||
Outlook clients and the SOGo server with Native Outlook Compatibility
|
||||
module. If you do, use "Outlook Anywhere" to connect Outlook to
|
||||
SOGo/OpenChange.
|
||||
|
||||
Current Limitations
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The current version of the Native Microsoft Outlook compatibility layer
|
||||
has some limitations.
|
||||
|
||||
Those limitations will be overcome in the upcoming releases. If you are
|
||||
interested in having those limitations fixed more rapidly, please
|
||||
contact Inverse by sending an email to support@inverse.ca.
|
||||
|
||||
General
|
||||
^^^^^^^
|
||||
|
||||
* If you can't see any email's content with Microsoft Outlook 2007,
|
||||
install the latest Service Pack available from Microsoft's website for
|
||||
this specific version. Microsoft Outlook 2007 (12.0.6423.100) SP2 MSO
|
||||
(12.0.6425.1000) is known to work.
|
||||
* When you create a new Microsoft Outlook profile, not all folders might
|
||||
be synchronized during the first start. Simply select the appropriate
|
||||
folder and click "Send and Receive". Synchronizing a folder may take
|
||||
some time. For example, a folder with 1000 email messages might take
|
||||
around 5 minutes based on the underlying hardware.
|
||||
* Errors when synchronizing the "Offline Address Book" are normal and
|
||||
can be ignored for now. This feature is currently not supported.
|
||||
* If you face strange issues from Microsoft Outlook, you might want to
|
||||
remove any data associated with the user from the SOGo server and
|
||||
recreate a Microsoft Outlook profile.
|
||||
To remove any data associated to a user, use
|
||||
the `openchange_user_cleanup` script distributed with SOGo. The script
|
||||
can be found in `/usr/share/doc/sogo/` (`/usr/share/sogo-VERSION/` on
|
||||
RHEL).
|
||||
To reset a user, run the script as root:
|
||||
`python openchange_user_cleanup username`. See the usage output for additional options.
|
||||
* The "Out of Office Assistant" will not currently work. This feature
|
||||
has not been implemented.
|
||||
* Creating folders below INBOX (when not normally permitted by the IMAP
|
||||
server), below the Personal Calendar or Personal Address Book will work
|
||||
in Outlook cached mode but the server-side operation will fail and these
|
||||
folders will never be created. Potentially data loss can occur if the
|
||||
Outlook profile is destroyed. If you wan to create additional top-level
|
||||
mail folders, calendars or address books, open Outlook's folder list,
|
||||
select the top level node (usually, "email@example.com") and choose "New
|
||||
Folder..." from the contextual menu. Choose the relevant item types.
|
||||
|
||||
Mail
|
||||
^^^^
|
||||
|
||||
* Sharing mail folders is not supported.
|
||||
* To avoid possibly lossy conversion from RTF to HTML, Outlook should be
|
||||
configured to send all mails as HTML (or plaintext) instead of _Outlook
|
||||
Rich Text Format_.
|
||||
|
||||
Calendar
|
||||
^^^^^^^^
|
||||
|
||||
* Labels will not work.
|
||||
* It might be impossible to view event details from a shared calendar.
|
||||
This issue is being worked on.
|
||||
|
||||
Tasks
|
||||
^^^^^
|
||||
|
||||
* Tasks with start/due dates created from Outlook might not appear
|
||||
correctly in SOGo due to a timezone issue.
|
||||
* Reminders are not yet supported.
|
||||
* Assigning tasks will not work.
|
||||
|
||||
Contacts
|
||||
^^^^^^^^
|
||||
|
||||
* Categories will not work.
|
||||
* Distribution lists will not work.
|
||||
* Under Microsoft Outlook 2010, the special folder "Suggested Contacts"
|
||||
will not work.
|
||||
* The "Offline Address Book" will not work. This feature is not yet
|
||||
supported.
|
||||
|
||||
Notes
|
||||
^^^^^
|
||||
|
||||
* Notes are not synchronized in any ways with SOGo. The current version
|
||||
of SOGo lacks support for notes.
|
||||
|
||||
If you notice anything else, please send contact Inverse by sending an
|
||||
email to support@inverse.ca.
|
||||
|
||||
include::includes/additional-info.asciidoc[]
|
||||
|
||||
include::includes/commercial-support.asciidoc[]
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 401 KiB |
@@ -1,16 +0,0 @@
|
||||
#
|
||||
# fop fix to build our documentation on CentOS 6
|
||||
#
|
||||
# Inverse inc. <info@inverse.ca>
|
||||
#
|
||||
--- /usr/bin/fop.orig 2012-01-17 21:25:50.000000000 -0500
|
||||
+++ /usr/bin/fop 2012-01-17 21:26:04.000000000 -0500
|
||||
@@ -26,7 +26,7 @@
|
||||
# Set parameters
|
||||
set_jvm
|
||||
set_classpath commons-io batik-all avalon-framework xmlgraphics-commons \
|
||||
- commons-logging fop
|
||||
+ commons-logging fop xalan-j2
|
||||
set_flags $BASE_FLAGS
|
||||
set_options $BASE_OPTIONS
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
#
|
||||
# xmlgraphics-fop fix to build our documentation on CentOS 5
|
||||
# taken from https://build.opensuse.org/request/show/68994
|
||||
#
|
||||
# Inverse inc. <info@inverse.ca>
|
||||
#
|
||||
--- /usr/bin/xmlgraphics-fop.orig 2012-01-17 18:42:08.000000000 -0500
|
||||
+++ /usr/bin/xmlgraphics-fop 2012-01-17 18:42:18.000000000 -0500
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
# Rest of the configuration
|
||||
MAIN_CLASS=org.apache.fop.cli.Main
|
||||
-BASE_JARS="xmlgraphics-fop xmlgraphics-batik/util xml-commons-jaxp-1.3-apis excalibur/avalon-framework-api xerces-j2 xalan-j2 xalan-j2-serializer"
|
||||
+BASE_JARS="xmlgraphics-fop batik-all xml-commons-jaxp-1.3-apis excalibur/avalon-framework-impl excalibur/avalon-framework-api xerces-j2 xalan-j2 xalan-j2-serializer"
|
||||
|
||||
# Set parameters
|
||||
set_jvm
|
||||
@@ -1,107 +0,0 @@
|
||||
<?xml version='1.0'?>
|
||||
<xsl:stylesheet
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:fo="http://www.w3.org/1999/XSL/Format"
|
||||
version="1.0">
|
||||
|
||||
<!-- ********************************************************************
|
||||
|
||||
Header / Footer customizations
|
||||
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2011-2014 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
******************************************************************** -->
|
||||
|
||||
<!--
|
||||
Here we are re-defining docbook-xsl/fo/pagesetup.xsl to fit our needs.
|
||||
- top: chapter number on the left
|
||||
- bottom: copyright, chapter name, page
|
||||
-->
|
||||
|
||||
<xsl:param name="header.rule" select="0"/>
|
||||
|
||||
<xsl:template name="header.content">
|
||||
<xsl:param name="pageclass" select="''"/>
|
||||
<xsl:param name="sequence" select="''"/>
|
||||
<xsl:param name="position" select="''"/>
|
||||
<xsl:param name="gentext-key" select="''"/>
|
||||
|
||||
<fo:block>
|
||||
<!-- sequence can be odd, even, first, blank -->
|
||||
<!-- position can be left, center, right -->
|
||||
<xsl:choose>
|
||||
<xsl:when test="$sequence = 'blank'">
|
||||
<!-- nothing -->
|
||||
</xsl:when>
|
||||
|
||||
<xsl:when test="($sequence='first' or $sequence='odd' or $sequence='even') and $position='left'">
|
||||
<xsl:if test="$pageclass != 'titlepage' and $pageclass != 'lot'">
|
||||
<xsl:call-template name="gentext">
|
||||
<xsl:with-param name="key" select="'chapter'"/>
|
||||
</xsl:call-template>
|
||||
<xsl:call-template name="gentext.space"/>
|
||||
<xsl:number count="chapter" from="book" level="any"/>
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
|
||||
<!-- draft -->
|
||||
<xsl:when test="$position='right'">
|
||||
<xsl:call-template name="draft.text"/>
|
||||
</xsl:when>
|
||||
|
||||
<xsl:otherwise>
|
||||
<!-- nop -->
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:param name="footer.rule" select="0"/>
|
||||
<xsl:template name="footer.content">
|
||||
<xsl:param name="pageclass" select="''"/>
|
||||
<xsl:param name="sequence" select="''"/>
|
||||
<xsl:param name="position" select="''"/>
|
||||
<xsl:param name="gentext-key" select="''"/>
|
||||
|
||||
<fo:block>
|
||||
<!-- pageclass can be front, body, back -->
|
||||
<!-- sequence can be odd, even, first, blank -->
|
||||
<!-- position can be left, center, right -->
|
||||
<xsl:choose>
|
||||
<xsl:when test="$pageclass = 'titlepage'">
|
||||
<!-- nop; no footer on title pages -->
|
||||
</xsl:when>
|
||||
|
||||
<xsl:when test="$double.sided = 0 and $position='left'">
|
||||
<xsl:apply-templates select="//copyright[1]" mode="titlepage.mode"/>
|
||||
</xsl:when>
|
||||
|
||||
<xsl:when test="($sequence='first' or $sequence='odd' or $sequence='even') and $position='center'">
|
||||
<xsl:if test="$pageclass != 'titlepage' and $pageclass != 'lot'">
|
||||
<xsl:apply-templates select="." mode="titleabbrev.markup"/>
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
|
||||
<xsl:when test="$double.sided = 0 and $position='right'">
|
||||
<fo:page-number/>
|
||||
</xsl:when>
|
||||
|
||||
<xsl:when test="$sequence='blank'">
|
||||
<!-- nop -->
|
||||
</xsl:when>
|
||||
|
||||
<xsl:otherwise>
|
||||
<!-- nop -->
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
|
||||
</xsl:stylesheet>
|
||||
<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
|
||||
@@ -1,182 +0,0 @@
|
||||
<?xml version='1.0'?>
|
||||
<xsl:stylesheet
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:fo="http://www.w3.org/1999/XSL/Format"
|
||||
version="1.0">
|
||||
|
||||
<!-- ********************************************************************
|
||||
|
||||
SOGo Documentation Docbook FO Parameters
|
||||
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2011-2014 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
******************************************************************** -->
|
||||
|
||||
<!--
|
||||
Global Tasks
|
||||
|
||||
TODO prettier revhistory
|
||||
TODO prettier Table of Contents
|
||||
TODO generate PDF table of contents (like OSX's Preview shows on the right hand side)
|
||||
TODO title 2
|
||||
- align with text?
|
||||
- more above whitespace
|
||||
TODO change the bullet for a prettier one
|
||||
TODO title 3 and 4
|
||||
- align with text?
|
||||
- should be easier to differentiate (check network guide)
|
||||
TODO icon on line wrap in monospace boxes
|
||||
TODO caution, notes, warnings, etc.
|
||||
- box around it
|
||||
- sexy icon
|
||||
TODO -> is converted into an arrow but it's not pretty (is it font or docbook-thingy?)
|
||||
|
||||
-->
|
||||
|
||||
<!--
|
||||
Load default values
|
||||
|
||||
Real upstream schema is at:
|
||||
<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
|
||||
|
||||
but we decided to load all sensible local xsd since it only produce a warning on missing imports.
|
||||
-->
|
||||
<!-- CentOS / RHEL -->
|
||||
<xsl:import href="/usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl"/>
|
||||
<!-- Debian / Ubuntu -->
|
||||
<xsl:import href="/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl"/>
|
||||
<!-- OSX through mac ports -->
|
||||
<xsl:import href="/opt/local/share/xsl/docbook-xsl/fo/docbook.xsl"/>
|
||||
|
||||
<!-- title page extra styling -->
|
||||
<xsl:import href="titlepage-fo.xsl"/>
|
||||
|
||||
<!-- header / footer extra styling -->
|
||||
<xsl:import href="headerfooter-fo.xsl"/>
|
||||
|
||||
<!-- attaching an image to the verso legalnotice component -->
|
||||
<xsl:template match="legalnotice" mode="book.titlepage.verso.mode">
|
||||
<xsl:apply-templates mode="titlepage.mode"/>
|
||||
<fo:block text-align="right">
|
||||
<fo:external-graphic src="url('images/inverse-logo.jpg')" width="3in" content-width="scale-to-fit"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<!-- stylesheet options -->
|
||||
<xsl:param name="title.font.family">Lato-Medium</xsl:param>
|
||||
<xsl:param name="chapter.autolabel" select="0"/>
|
||||
<xsl:attribute-set name="component.title.properties">
|
||||
<xsl:attribute name="padding-bottom">2.5em</xsl:attribute>
|
||||
<xsl:attribute name="border-bottom">solid 2px</xsl:attribute>
|
||||
<xsl:attribute name="margin-bottom">1em</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
<xsl:attribute-set name="section.title.level1.properties">
|
||||
<xsl:attribute name="border-bottom">solid 1px</xsl:attribute>
|
||||
<xsl:attribute name="margin-top">2em</xsl:attribute>
|
||||
<xsl:attribute name="margin-bottom">1em</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
<!-- titles spacing -->
|
||||
<xsl:attribute-set name="section.title.level2.properties">
|
||||
<xsl:attribute name="margin-top">1em</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
<!-- default fonts -->
|
||||
<xsl:param name="body.font.family">Lato-Light</xsl:param>
|
||||
<xsl:param name="body.font.master">10</xsl:param>
|
||||
<xsl:param name="monospace.font.family">Incosolata</xsl:param>
|
||||
|
||||
<!-- revision table layout -->
|
||||
<xsl:attribute-set name="revhistory.title.properties">
|
||||
<xsl:attribute name="font-size">12pt</xsl:attribute>
|
||||
<xsl:attribute name="font-weight">bold</xsl:attribute>
|
||||
<xsl:attribute name="text-align">center</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
<xsl:attribute-set name="revhistory.table.properties">
|
||||
<xsl:attribute name="break-before">page</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
<xsl:attribute-set name="revhistory.table.cell.properties">
|
||||
<xsl:attribute name="border-bottom">1px solid</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
<!-- Table Of Contents (TOC) options -->
|
||||
<!-- We only want 2 level of ToC depth -->
|
||||
<xsl:param name="toc.section.depth" select="1"/>
|
||||
|
||||
<!-- titles left margin -->
|
||||
<xsl:attribute-set name="section.title.properties">
|
||||
<xsl:attribute name="start-indent"><xsl:value-of select="$body.start.indent"/></xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
<!-- lists type -->
|
||||
<xsl:template name="itemizedlist.label.markup">
|
||||
<xsl:param name="itemsymbol" select="'square'"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$itemsymbol='square'"><fo:inline font-family="Lato-Light">▪</fo:inline></xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
<xsl:template name="next.itemsymbol">
|
||||
<xsl:param name="itemsymbol" select="'default'"/>
|
||||
<xsl:choose>
|
||||
<xsl:otherwise>square</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- admonition -->
|
||||
<xsl:param name="admon.graphics" select="1"></xsl:param>
|
||||
<xsl:param name="admon.graphics.path">images/</xsl:param>
|
||||
<xsl:param name="admon.graphics.extension">.png</xsl:param>
|
||||
<xsl:attribute-set name="graphical.admonition.properties">
|
||||
<xsl:attribute name="border-top">1px solid</xsl:attribute>
|
||||
<xsl:attribute name="border-bottom">1px solid</xsl:attribute>
|
||||
<xsl:attribute name="padding-top">0.5em</xsl:attribute>
|
||||
<xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
|
||||
<xsl:attribute name="margin-left">2em</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
|
||||
<!-- grey boxes around code (screen, programlisting) -->
|
||||
<xsl:param name="shade.verbatim" select="1"/>
|
||||
<xsl:attribute-set name="shade.verbatim.style">
|
||||
<xsl:attribute name="background-color">#E0E0E0</xsl:attribute>
|
||||
<xsl:attribute name="border">thin #9F9F9F solid</xsl:attribute>
|
||||
<xsl:attribute name="margin">0pt</xsl:attribute>
|
||||
<xsl:attribute name="padding">0.5em</xsl:attribute>
|
||||
<!-- prevent page breaks in screen and programlisting tags -->
|
||||
<xsl:attribute name="keep-together.within-column">always</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
<!-- breaking long lines in code (screen, programlisting) -->
|
||||
<xsl:attribute-set name="monospace.verbatim.properties">
|
||||
<xsl:attribute name="wrap-option">wrap</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
<!-- don't show raw links in [ .. ] after a link -->
|
||||
<xsl:param name="ulink.show" select="0"/>
|
||||
|
||||
<!-- blue underlined hyperlink -->
|
||||
<xsl:attribute-set name="xref.properties">
|
||||
<xsl:attribute name="color">blue</xsl:attribute>
|
||||
<xsl:attribute name="text-decoration">underline</xsl:attribute>
|
||||
</xsl:attribute-set>
|
||||
|
||||
<!-- strong emphasis in bold -->
|
||||
<xsl:template match="emphasis[@role='strong']">
|
||||
<fo:inline font-family="Lato" font-weight="normal">
|
||||
<xsl:apply-templates/>
|
||||
</fo:inline>
|
||||
</xsl:template>
|
||||
|
||||
<!-- copyright in range instead of seperated years -->
|
||||
<xsl:param name="make.year.ranges" select="1" />
|
||||
|
||||
<!-- variablelist behavior (asciidoc's term:: lists) -->
|
||||
<!-- <xsl:param name="variablelist.term.break.after" select="1" /> -->
|
||||
|
||||
</xsl:stylesheet>
|
||||
<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
|
||||
@@ -1,96 +0,0 @@
|
||||
<!DOCTYPE t:templates [
|
||||
<!ENTITY hsize0 "10pt">
|
||||
<!ENTITY hsize1 "12pt">
|
||||
<!ENTITY hsize2 "14.4pt">
|
||||
<!ENTITY hsize3 "17.28pt">
|
||||
<!ENTITY hsize4 "20.736pt">
|
||||
<!ENTITY hsize5 "24.8832pt">
|
||||
<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
|
||||
<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
|
||||
<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
|
||||
<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
|
||||
<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
|
||||
<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
|
||||
]>
|
||||
<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
|
||||
xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
|
||||
xmlns:fo="http://www.w3.org/1999/XSL/Format"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
|
||||
<!-- ********************************************************************
|
||||
|
||||
SOGo title page
|
||||
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2011-2014 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
******************************************************************** -->
|
||||
|
||||
<!--
|
||||
If you make changes you need to rebuild XSL:
|
||||
|
||||
xsltproc -o docs/docbook/xsl/titlepage-fo.xsl \
|
||||
/usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl \
|
||||
docs/docbook/xsl/titlepage-fo.xml
|
||||
|
||||
On some platforms the titlepage.xsl is located elsewhere:
|
||||
* OSX: /opt/local/share/xsl/docbook-xsl/template/titlepage.xsl
|
||||
|
||||
This is a customized version of docbook-xsl/fo/titlepage.templates.xml.
|
||||
I removed every section except the book one. Feel free to add more if more
|
||||
customization are required.
|
||||
-->
|
||||
|
||||
<t:titlepage t:element="book" t:wrapper="fo:block">
|
||||
<t:titlepage-content t:side="recto">
|
||||
<mediaobject/>
|
||||
<title
|
||||
t:named-template="division.title"
|
||||
param:node="ancestor-or-self::book[1]"
|
||||
text-align="right"
|
||||
font-size="&hsize5;"
|
||||
space-before="&hsize5space;"
|
||||
font-weight="bold"
|
||||
font-family="{$title.fontset}"
|
||||
margin-top="8em"/>
|
||||
<subtitle
|
||||
text-align="right"
|
||||
font-size="&hsize4;"
|
||||
space-before="&hsize4space;"
|
||||
font-family="{$title.fontset}"
|
||||
border-bottom="solid"/>
|
||||
</t:titlepage-content>
|
||||
|
||||
<t:titlepage-content t:side="verso">
|
||||
<title
|
||||
font-size="&hsize2;"
|
||||
font-weight="bold"
|
||||
font-family="{$title.fontset}"/>
|
||||
<corpauthor/>
|
||||
<authorgroup t:named-template="verso.authorgroup"/>
|
||||
<author/>
|
||||
<othercredit/>
|
||||
<releaseinfo space-before="0.5em"/>
|
||||
<pubdate space-before="1em"/>
|
||||
<copyright/>
|
||||
<abstract/>
|
||||
<legalnotice font-size="8pt"/>
|
||||
</t:titlepage-content>
|
||||
|
||||
<t:titlepage-separator>
|
||||
<fo:block break-after="page"/>
|
||||
</t:titlepage-separator>
|
||||
|
||||
<t:titlepage-before t:side="recto">
|
||||
</t:titlepage-before>
|
||||
|
||||
<t:titlepage-before t:side="verso">
|
||||
<fo:block break-after="page"/>
|
||||
</t:titlepage-before>
|
||||
</t:titlepage>
|
||||
|
||||
</t:templates>
|
||||
@@ -1,208 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
|
||||
|
||||
<!-- This stylesheet was created by template/titlepage.xsl-->
|
||||
|
||||
<xsl:template name="book.titlepage.recto">
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/mediaobject"/>
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/mediaobject"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="bookinfo/title">
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="info/title">
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="title">
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="bookinfo/subtitle">
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="info/subtitle">
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="subtitle">
|
||||
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="book.titlepage.verso">
|
||||
<xsl:choose>
|
||||
<xsl:when test="bookinfo/title">
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/title"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="info/title">
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/title"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="title">
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="title"/>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/corpauthor"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/corpauthor"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/authorgroup"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/authorgroup"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/author"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/author"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/othercredit"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/othercredit"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/releaseinfo"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/releaseinfo"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/pubdate"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/pubdate"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/copyright"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/copyright"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/abstract"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/abstract"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/legalnotice"/>
|
||||
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/legalnotice"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="book.titlepage.separator"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="book.titlepage.before.recto">
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="book.titlepage.before.verso"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="book.titlepage">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
|
||||
<xsl:variable name="recto.content">
|
||||
<xsl:call-template name="book.titlepage.before.recto"/>
|
||||
<xsl:call-template name="book.titlepage.recto"/>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="recto.elements.count">
|
||||
<xsl:choose>
|
||||
<xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
|
||||
<xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
|
||||
<!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
|
||||
<xsl:otherwise>1</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)">
|
||||
<fo:block><xsl:copy-of select="$recto.content"/></fo:block>
|
||||
</xsl:if>
|
||||
<xsl:variable name="verso.content">
|
||||
<xsl:call-template name="book.titlepage.before.verso"/>
|
||||
<xsl:call-template name="book.titlepage.verso"/>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="verso.elements.count">
|
||||
<xsl:choose>
|
||||
<xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
|
||||
<xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
|
||||
<!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
|
||||
<xsl:otherwise>1</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)">
|
||||
<fo:block><xsl:copy-of select="$verso.content"/></fo:block>
|
||||
</xsl:if>
|
||||
<xsl:call-template name="book.titlepage.separator"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="*" mode="book.titlepage.recto.mode">
|
||||
<!-- if an element isn't found in this mode, -->
|
||||
<!-- try the generic titlepage.mode -->
|
||||
<xsl:apply-templates select="." mode="titlepage.mode"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="*" mode="book.titlepage.verso.mode">
|
||||
<!-- if an element isn't found in this mode, -->
|
||||
<!-- try the generic titlepage.mode -->
|
||||
<xsl:apply-templates select="." mode="titlepage.mode"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="mediaobject" mode="book.titlepage.recto.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="right" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}" margin-top="8em">
|
||||
<xsl:call-template name="division.title">
|
||||
<xsl:with-param name="node" select="ancestor-or-self::book[1]"/>
|
||||
</xsl:call-template>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="right" font-size="20.736pt" space-before="15.552pt" font-family="{$title.fontset}" border-bottom="solid">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="title" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="14.4pt" font-weight="bold" font-family="{$title.fontset}">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="corpauthor" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="authorgroup" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
|
||||
<xsl:call-template name="verso.authorgroup">
|
||||
</xsl:call-template>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="author" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="othercredit" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="releaseinfo" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="0.5em">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="pubdate" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="1em">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="copyright" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="abstract" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="legalnotice" mode="book.titlepage.verso.auto.mode">
|
||||
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="8pt">
|
||||
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
|
||||
</fo:block>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
<!-- TODO have the build system take care of this -->
|
||||
<releaseinfo>Version 2.3.1 - July 2015</releaseinfo>
|
||||
<subtitle>for version 2.3.1</subtitle>
|
||||
<date>2015-07-23</date>
|
||||
|
||||
<legalnotice>
|
||||
<para>Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".</para>
|
||||
|
||||
<!-- font licenses -->
|
||||
<para>The fonts used in this guide are licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: <ulink url="http://scripts.sil.org/OFL">http://scripts.sil.org/OFL</ulink></para>
|
||||
<para>Copyright © Łukasz Dziedzic, <ulink url="http://www.latofonts.com/">http://www.latofonts.com</ulink>, with Reserved Font Name: "Lato".</para>
|
||||
<para>Copyright © Raph Levien, <ulink url="http://levien.com/">http://levien.com/</ulink>, with Reserved Font Name: "Inconsolata".</para>
|
||||
</legalnotice>
|
||||
<mediaobject>
|
||||
<objectinfo>
|
||||
<corpname>Inverse inc.</corpname>
|
||||
</objectinfo>
|
||||
<textobject>
|
||||
<phrase>SOGo logo</phrase>
|
||||
</textobject>
|
||||
<imageobject>
|
||||
<imagedata align="left" width="4in" format="PNG" fileref="images/sogo-logo.png" />
|
||||
</imageobject>
|
||||
</mediaobject>
|
||||
@@ -1,32 +0,0 @@
|
||||
<fop version="1.0">
|
||||
<renderers>
|
||||
<renderer mime="application/pdf">
|
||||
<fonts>
|
||||
<font metrics-url="fonts/inconsolata.xml" kerning="yes" embed-url="fonts/inconsolata.ttf">
|
||||
<font-triplet name="Incosolata" style="normal" weight="normal"/>
|
||||
</font>
|
||||
<font metrics-url="fonts/lato/Lato-Regular.xml" kerning="yes" embed-url="fonts/lato/Lato-Regular.ttf">
|
||||
<font-triplet name="Lato" style="normal" weight="normal"/>
|
||||
</font>
|
||||
<font metrics-url="fonts/lato/Lato-Italic.xml" kerning="yes" embed-url="fonts/lato/Lato-Italic.ttf">
|
||||
<font-triplet name="Lato" style="italic" weight="normal"/>
|
||||
</font>
|
||||
<font metrics-url="fonts/lato/Lato-Light.xml" kerning="yes" embed-url="fonts/lato/Lato-Light.ttf">
|
||||
<font-triplet name="Lato-Light" style="normal" weight="normal"/>
|
||||
</font>
|
||||
<font metrics-url="fonts/lato/Lato-LightItalic.xml" kerning="yes" embed-url="fonts/lato/Lato-LightItalic.ttf">
|
||||
<font-triplet name="Lato-Light" style="italic" weight="normal"/>
|
||||
</font>
|
||||
<font metrics-url="fonts/lato/Lato-Medium.xml" kerning="yes" embed-url="fonts/lato/Lato-Medium.ttf">
|
||||
<font-triplet name="Lato-Medium" style="normal" weight="normal"/>
|
||||
</font>
|
||||
<font metrics-url="fonts/lato/Lato-MediumItalic.xml" kerning="yes" embed-url="fonts/lato/Lato-MediumItalic.ttf">
|
||||
<font-triplet name="Lato-Medium" style="italic" weight="normal"/>
|
||||
</font>
|
||||
<font metrics-url="fonts/lato/Lato-Semibold.xml" kerning="yes" embed-url="fonts/lato/Lato-Semibold.ttf">
|
||||
<font-triplet name="Lato-Semibold" style="normal" weight="normal"/>
|
||||
</font>
|
||||
</fonts>
|
||||
</renderer>
|
||||
</renderers>
|
||||
</fop>
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Inconsolata</font-name><full-name>Inconsolata</full-name><family-name>Inconsolata</family-name><embed/><cap-height>624</cap-height><x-height>458</x-height><ascender>820</ascender><descender>-180</descender><bbox><left>-1</left><bottom>-177</bottom><right>510</right><top>835</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="3" ue="126" us="32"/><bf gi="98" ue="255" us="160"/><bf gi="194" ue="263" us="258"/><bf gi="200" ue="273" us="268"/><bf gi="206" ue="283" us="280"/><bf gi="210" ue="287" us="286"/><bf gi="212" ue="305" us="304"/><bf gi="214" ue="314" us="312"/><bf gi="217" ue="318" us="317"/><bf gi="219" ue="324" us="321"/><bf gi="223" ue="328" us="327"/><bf gi="225" ue="331" us="330"/><bf gi="227" ue="333" us="333"/><bf gi="228" ue="341" us="336"/><bf gi="234" ue="347" us="344"/><bf gi="238" ue="357" us="350"/><bf gi="246" ue="369" us="366"/><bf gi="250" ue="382" us="376"/><bf gi="257" ue="402" us="402"/><bf gi="258" ue="567" us="567"/><bf gi="259" ue="711" us="710"/><bf gi="261" ue="713" us="713"/><bf gi="262" ue="715" us="715"/><bf gi="263" ue="733" us="728"/><bf gi="269" ue="8218" us="8216"/><bf gi="272" ue="8222" us="8220"/><bf gi="275" ue="8226" us="8224"/><bf gi="278" ue="8230" us="8230"/><bf gi="279" ue="8250" us="8249"/><bf gi="281" ue="8260" us="8260"/><bf gi="282" ue="8308" us="8308"/><bf gi="283" ue="8364" us="8364"/><bf gi="284" ue="8482" us="8482"/><bf gi="285" ue="8593" us="8593"/><bf gi="286" ue="8595" us="8595"/><bf gi="287" ue="8722" us="8722"/><bf gi="288" ue="9251" us="9251"/><bf gi="0" ue="65535" us="65535"/></bfranges><cid-widths start-index="0"><wx w="500"/><wx w="0"/><wx w="333"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wLine truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Black</font-name><full-name>Lato Black</full-name><family-name>Lato</family-name><embed/><cap-height>728</cap-height><x-height>518</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-654</left><bottom>-299</bottom><right>1356</right><top>1116</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-BlackItalic</font-name><full-name>Lato Black Italic</full-name><family-name>Lato</family-name><embed/><cap-height>728</cap-height><x-height>518</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-537</left><bottom>-297</bottom><right>1295</right><top>1114</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Bold</font-name><full-name>Lato Bold</full-name><family-name>Lato</family-name><embed/><cap-height>723</cap-height><x-height>513</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-603</left><bottom>-285</bottom><right>1344</right><top>1099</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us="2Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-BoldItalic</font-name><full-name>Lato Bold Italic</full-name><family-name>Lato</family-name><embed/><cap-height>723</cap-height><x-height>513</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-520</left><bottom>-283</bottom><right>1293</right><top>1097</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Hairline</font-name><full-name>Lato Hairline</full-name><family-name>Lato</family-name><embed/><cap-height>700</cap-height><x-height>490</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-459</left><bottom>-259</bottom><right>1340</right><top>1034</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="29Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-HairlineItalic</font-name><full-name>Lato Hairline Italic</full-name><family-name>Lato</family-name><embed/><cap-height>700</cap-height><x-height>490</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-459</left><bottom>-259</bottom><right>1286</right><top>1034</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gLine truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Heavy</font-name><full-name>Lato Heavy</full-name><family-name>Lato</family-name><embed/><cap-height>725</cap-height><x-height>515</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-626</left><bottom>-291</bottom><right>1345</right><top>1107</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-HeavyItalic</font-name><full-name>Lato Heavy Italic</full-name><family-name>Lato</family-name><embed/><cap-height>725</cap-height><x-height>515</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-528</left><bottom>-289</bottom><right>1294</right><top>1105</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Italic</font-name><full-name>Lato Italic</full-name><family-name>Lato</family-name><embed/><cap-height>716</cap-height><x-height>506</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-501</left><bottom>-268</bottom><right>1290</right><top>1077</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" ue="293" Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Light</font-name><full-name>Lato Light</full-name><family-name>Lato</family-name><embed/><cap-height>707</cap-height><x-height>497</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-479</left><bottom>-263</bottom><right>1341</right><top>1055</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-LightItalic</font-name><full-name>Lato Light Italic</full-name><family-name>Lato</family-name><embed/><cap-height>707</cap-height><x-height>497</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-479</left><bottom>-263</bottom><right>1288</right><top>1054</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Medium</font-name><full-name>Lato Medium</full-name><family-name>Lato</family-name><embed/><cap-height>717</cap-height><x-height>507</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-556</left><bottom>-270</bottom><right>1343</right><top>1082</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" uLine truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-MediumItalic</font-name><full-name>Lato Medium Italic</full-name><family-name>Lato</family-name><embed/><cap-height>717</cap-height><x-height>507</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-504</left><bottom>-269</bottom><right>1291</right><top>1080</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="2Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Regular</font-name><full-name>Lato Regular</full-name><family-name>Lato</family-name><embed/><cap-height>716</cap-height><x-height>506</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-546</left><bottom>-268</bottom><right>1342</right><top>1078</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293"Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Semibold</font-name><full-name>Lato Semibold</full-name><family-name>Lato</family-name><embed/><cap-height>720</cap-height><x-height>510</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-576</left><bottom>-277</bottom><right>1343</right><top>1090</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="29Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-SemiboldItalic</font-name><full-name>Lato Semibold Italic</full-name><family-name>Lato</family-name><embed/><cap-height>720</cap-height><x-height>510</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-511</left><bottom>-275</bottom><right>1291</right><top>1088</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gLine truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Thin</font-name><full-name>Lato Thin</full-name><family-name>Lato</family-name><embed/><cap-height>703</cap-height><x-height>493</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-467</left><bottom>-261</bottom><right>1340</right><top>1042</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us="2Line truncated
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-ThinItalic</font-name><full-name>Lato Thin Italic</full-name><family-name>Lato</family-name><embed/><cap-height>703</cap-height><x-height>493</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-467</left><bottom>-261</bottom><right>1287</right><top>1042</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" Line truncated
|
||||
@@ -1,41 +0,0 @@
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 272 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 6.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 234 KiB |
@@ -1,27 +0,0 @@
|
||||
////
|
||||
|
||||
Additional information section
|
||||
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2008-2014 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
|
||||
Additional Information
|
||||
----------------------
|
||||
|
||||
For more information, please consult the online FAQs (Frequently Asked
|
||||
Questions) :
|
||||
|
||||
http://www.sogo.nu/english/support/faq.html
|
||||
|
||||
You can also read the mailing archives or post your questions to it. For
|
||||
details, see :
|
||||
|
||||
https://lists.inverse.ca/sogo
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
@@ -1,26 +0,0 @@
|
||||
////
|
||||
|
||||
Commercial support section
|
||||
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2008-2014 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
|
||||
Commercial Support and Contact Information
|
||||
------------------------------------------
|
||||
|
||||
For any questions or comments, do not hesitate to contact us by writing
|
||||
an email to :
|
||||
|
||||
mailto:support@inverse.ca[support@inverse.ca]
|
||||
|
||||
Inverse (http://inverse.ca/[http://inverse.ca]) offers professional
|
||||
services around SOGo to help organizations deploy the solution and
|
||||
migrate from their legacy systems.
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
@@ -1,18 +0,0 @@
|
||||
////
|
||||
|
||||
Global Attributes for our documentation
|
||||
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2008-2015 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
|
||||
// TODO have the build system take care of this
|
||||
|
||||
:release_version: 2.3.1
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
@@ -1,19 +0,0 @@
|
||||
////
|
||||
|
||||
License section
|
||||
|
||||
This file is part of the SOGo project.
|
||||
Authors:
|
||||
- Inverse inc. <info@inverse.ca>
|
||||
|
||||
Copyright (C) 2008-2014 Inverse inc.
|
||||
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
|
||||
|
||||
////
|
||||
|
||||
GNU Free Documentation License
|
||||
------------------------------
|
||||
|
||||
Please refer to http://www.gnu.org/licenses/fdl-1.2.txt for the full license.
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
File renamed without changes.
Binary file not shown.
|
After Width: | Height: | Size: 311 KiB |
File renamed without changes.
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
File renamed without changes.
@@ -6,6 +6,7 @@ include $(GNUSTEP_MAKEFILES)/common.make
|
||||
SUBPROJECTS = \
|
||||
SOPE/NGCards \
|
||||
SOPE/GDLContentStore \
|
||||
OGoContentStore \
|
||||
SoObjects \
|
||||
Main \
|
||||
UI \
|
||||
|
||||
+2
-1
@@ -6,7 +6,8 @@ include ../Version
|
||||
|
||||
ADDITIONAL_OBJCFLAGS += -fPIE
|
||||
ADDITIONAL_INCLUDE_DIRS +=
|
||||
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo
|
||||
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj/
|
||||
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie
|
||||
|
||||
SOGOD = sogod
|
||||
TOOL_NAME = $(SOGOD)
|
||||
|
||||
@@ -9,12 +9,15 @@ ADDITIONAL_INCLUDE_DIRS += \
|
||||
-I..
|
||||
|
||||
ADDITIONAL_LIB_DIRS += \
|
||||
-L../SoObjects/SOGo/SOGo.framework/sogo \
|
||||
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
|
||||
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/
|
||||
-L../SoObjects/SOGo/SOGo.framework \
|
||||
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
|
||||
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/
|
||||
|
||||
SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
|
||||
|
||||
$(SOGOD)_TOOL_LIBS += \
|
||||
-lSOGo \
|
||||
-lOGoContentStore \
|
||||
-lGDLContentStore \
|
||||
-lGDLAccess \
|
||||
-lWEExtensions \
|
||||
|
||||
+3
-3
@@ -245,7 +245,7 @@ static BOOL debugLeaks;
|
||||
}
|
||||
else
|
||||
{
|
||||
[self errorWithFormat: @"No value specified for '%@'", *urlString];
|
||||
NSLog (@"No value specified for '%@'", *urlString);
|
||||
ok = NO;
|
||||
}
|
||||
}
|
||||
@@ -283,7 +283,7 @@ static BOOL debugLeaks;
|
||||
{
|
||||
id authenticator;
|
||||
|
||||
if (trustProxyAuthentication && [[context request] headerForKey: @"x-webobjects-remote-user"])
|
||||
if (trustProxyAuthentication)
|
||||
authenticator = [SOGoProxyAuthenticator sharedSOGoProxyAuthenticator];
|
||||
else
|
||||
{
|
||||
@@ -441,7 +441,7 @@ static BOOL debugLeaks;
|
||||
if (debugLeaks)
|
||||
{
|
||||
if (debugOn)
|
||||
[self logWithFormat: @"allocated classes:\n%s", GSDebugAllocationList (YES)];
|
||||
NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES));
|
||||
else
|
||||
{
|
||||
debugOn = YES;
|
||||
|
||||
+4
-4
@@ -1,15 +1,15 @@
|
||||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
Copyright (C) 2006-2015 Inverse inc.
|
||||
Copyright (C) 2006-2009 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
This file is part of OpenGroupware.org.
|
||||
|
||||
SOGo is free software; you can redistribute it and/or modify it under
|
||||
OGo is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
OGo 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 Lesser General Public
|
||||
License for more details.
|
||||
|
||||
@@ -1,401 +1,3 @@
|
||||
2.3.x (2015-MM-DD)
|
||||
------------------
|
||||
|
||||
Bug fixes
|
||||
- fixed display of whitelisted attendees in Preferences window on Firefox (#3285)
|
||||
- Non-latin subfolder names are displayed correctly on Outlook (Zentyal)
|
||||
- Fixed several sync issues on environments with multiple users (Zentyal)
|
||||
- Folders from other users will no longer appear on your Outlook (Zentyal)
|
||||
- Use right auth in multidomain environments in contacts and calendar from Outlook (Zentyal)
|
||||
|
||||
2.3.1 (2015-07-23)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- improved EAS speed, especially when fetching big attachments
|
||||
- now always enforce the organizer's default identity in appointments
|
||||
- improved the handling of default calendar categories/colors (#3200)
|
||||
- added support for DeletesAsMoves over EAS
|
||||
- added create-folder subcommand to sogo-tool to create contact and calendar folders
|
||||
- group mail addresses can be used as recipient in Outlook
|
||||
- added 'ActiveSync' module constraints
|
||||
- added Slovenian translation - thanks to Jens Riecken
|
||||
- added Chinese (Taiwan) translation
|
||||
|
||||
Bug fixes
|
||||
- EAS's GetItemEstimate/ItemOperations now support fetching mails and empty folders
|
||||
- fixed some rare cornercases in multidomain configurations
|
||||
- properly escape folder after creation using EAS (#3237)
|
||||
- fixed potential organizer highjacking when using EAS (#3131)
|
||||
- properly support big characters in EAS and fix encoding QP EAS error for Outlook (#3082)
|
||||
- properly encode id of DOM elements in Address Book module (#3239, #3245)
|
||||
- fixed multi-domain support for sogo-tool backup/restore (#2600)
|
||||
- fixed data ordering in events list of Calendar module (#3261)
|
||||
- fixed data ordering in tasks list of Calendar module (#3267)
|
||||
- Android EAS Lollipop fixes (#3268 and #3269)
|
||||
- improved EAS email flagging handling (#3140)
|
||||
- fixed computation of GlobalObjectId (#3235)
|
||||
- fixed EAS conversation ID issues on BB10 (#3152)
|
||||
- fixed CR/LF printing in event's description (#3228)
|
||||
- optimized Calendar module in multidomain configurations
|
||||
|
||||
2.3.0 (2015-06-01)
|
||||
-------------------
|
||||
|
||||
New features
|
||||
- Internet headers are now shown in Outlook (Zentyal)
|
||||
|
||||
Enhancements
|
||||
- improved multipart handling using EAS
|
||||
- added systemd startup script (PR#76)
|
||||
- added Basque translation - thanks to Gorka Gonzalez
|
||||
- updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations
|
||||
- calendar sharing request support among different Outlook versions (Zentyal)
|
||||
- improved sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal)
|
||||
- added support for sharing calendar invitations
|
||||
- missing contact fields are now saved and available when sharing it (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) (Zentyal)
|
||||
- appointment color and importance work now between Outlooks (Zentyal)
|
||||
- synchronize events, contacts and tasks in reverse chronological order (Zentyal)
|
||||
- during login, we now extract the domain from the user to accelerate authentication requests on sources
|
||||
- make sure sure email invitations can always be read by EAS clients
|
||||
- now able to print event/task's description (new components only) in the list view (#2881)
|
||||
- now possible to log EAS commands using the SOGoEASDebugEnabled system defaults
|
||||
- many improvements to EAS SmartReply/SmartForward commands
|
||||
- event invitation response mails from Outlook are now sent
|
||||
- mail subfolders created in WebMail are created when Outlook synchronises
|
||||
- mail root folder created in WebMail (same level INBOX) are created on Outlook logon
|
||||
|
||||
Bug fixes
|
||||
- now keep the BodyPreference for future EAS use and default to MIME if none set (#3146)
|
||||
- EAS reply fix when message/rfc822 parts are included in the original mail (#3153)
|
||||
- fixed yet an other potential crash during freebusy lookups during timezone changes
|
||||
- fixed display of freebusy information in event attendees editor during timezone changes
|
||||
- fixed timezone of MSExchange freebusy information
|
||||
- fixed a potential EAS error with multiple email priority flags
|
||||
- fixed paragraphs margins in HTML messages (#3163)
|
||||
- fixed regression when loading the inbox for the first time
|
||||
- fixed serialization of the PreventInvitationsWhitelist settings
|
||||
- fixed md4 support (for NTLM password changes) with GNU TLS
|
||||
- fixed edition of attachment URL in event/task editor
|
||||
- sent mails are not longer in Drafts folder using Outlook (Zentyal)
|
||||
- deleted mails are properly synced between Outlook profiles from the same account (Zentyal)
|
||||
- does not create a mail folder in other user's mailbox (Zentyal)
|
||||
- fix server-side crash with invalid events (Zentyal)
|
||||
- fix setting permissions for a folder with several users (Zentyal)
|
||||
- fix reception of calendar event invitations on optional attendees (Zentyal)
|
||||
- fix server side crash parsing rtf without color table (Zentyal)
|
||||
- weekly recurring events created in SOGo web interface are now shown in Outlook (Zentyal)
|
||||
- fix exception modifications import in recurrence series (Zentyal)
|
||||
- fix server side crash parsing rtf emails with images (with word97 format) (Zentyal)
|
||||
- fix sender on importing email messages like event invitations (Zentyal)
|
||||
- fix Outlook crashes when modifying the view of a folder (Zentyal)
|
||||
- fix server side crash when reading some recurrence appointments (Zentyal)
|
||||
- Outlook clients can use reply all functionality on multidomain environment (Zentyal)
|
||||
- optional attendes on events are now shown properly (Zentyal)
|
||||
- fixed the EAS maximum response size being per-folder, and not global
|
||||
- now set MeetingMessageType only for EAS 14.1
|
||||
- now correctly handle external invitations using EAS
|
||||
- now correctly handle multiple email addresses in the GAL over EAS (#3102)
|
||||
- now handle very large amount of participants correctly (#3175)
|
||||
- fix message bodies not shown on some EAS devices (#3173)
|
||||
- avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES
|
||||
- recurrent all day events are now shown properly in Outlook
|
||||
|
||||
2.2.17a (2015-03-15)
|
||||
--------------------
|
||||
|
||||
Bug fixes
|
||||
- avoid calling -stringByReplacingOccurrencesOfString:... for old GNUstep runtime
|
||||
|
||||
2.2.17 (2015-03-24)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- support for mail prority using EAS
|
||||
- immediately delete mails from EAS clients when they are marked as deleted on the IMAP server
|
||||
- now favor login@domain as the default email address if multiple mail: fields are specified
|
||||
- enable by default HTML mails support using EAS on Windows and BB phones
|
||||
- now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499)
|
||||
|
||||
Bug fixes
|
||||
- fixed login issue after password change (#2601)
|
||||
- fixed potential encoding issue using EAS and 8-bit mails (#3116)
|
||||
- multiple collections support for GetItemEstimate using EAS
|
||||
- fixed empty sync responses for EAS 2.5 and 12.0 clients
|
||||
- use the correct mail body element for EAS 2.5 clients
|
||||
- fixed tasks disappearing issue with RoadSync
|
||||
- use the correct body element for events for EAS 2.5 clients
|
||||
- SmartReply improvements for missing body attributes
|
||||
- do not use syncKey from cache when davCollectionTag = -1
|
||||
- use correct mail attachment elements for EAS 2.5 clients
|
||||
- fixed contacts lookup by UID in freebusy
|
||||
- reduced telephone number to a single value in JSON response of contacts list
|
||||
- fixed freebusy data when 'busy off hours' is enabled and period starts during the weekend
|
||||
- fixed fetching of freebusy data from the Web interface
|
||||
- fixed EAS handling of Bcc in emails (#3138)
|
||||
- fixed Language-Region tags in Web interface (#3121)
|
||||
- properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103)
|
||||
- prevent potential freebusy lookup crashes during timezone changes with repetitive events
|
||||
- improved GetItemEstimate to count all vasnished/deleted mails too
|
||||
- improvements to EAS SyncKey handling to avoid missing mails (#3048, #3058)
|
||||
- fixed EAS replies decoding from Outlook (#3123)
|
||||
|
||||
2.2.16 (2015-02-12)
|
||||
-------------------
|
||||
|
||||
New features
|
||||
- now possible for SOGo to change the sambaNTPassword/sambaLMPassword
|
||||
- now possible to limit automatic forwards to internal/external domains
|
||||
|
||||
Enhancements
|
||||
- added support for email categories using EAS (#2995)
|
||||
- now possible to always send vacation messages (#2332)
|
||||
- added EAS best practices to the documentation
|
||||
- improved fetching of text parts over EAS
|
||||
- updated Czech, Finnish, French, German and Hungarian translations
|
||||
|
||||
Bug fixes
|
||||
- (regression) fixed sending a message when mail module is not active (#3088)
|
||||
- mail labels with blanks are not handled correctly (#3078)
|
||||
- fixed BlackBerry issues sending multiple mails over EAS (#3095)
|
||||
- fixed plain/text mails showing on one line on Android/EAS (#3055)
|
||||
- fixed exception in sogo-tool when parsing arguments of a set operation
|
||||
|
||||
2.2.15 (2015-01-30)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- improved handling of EAS Push when no heartbeat is provided
|
||||
- no longer need to kill Outlook 2013 when creating EAS profiles (#3076)
|
||||
- improved server-side CSS cleaner (#3040)
|
||||
- unified the logging messages in sogo.log file (#2534/#3063)
|
||||
- updated Brazilian (Portuguese) and Hungarian translations
|
||||
|
||||
2.2.14 (2015-01-20)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- MultipleBookingsFieldName can be set to -1 to show busy status when booked at least once
|
||||
- handle multipart objects in EAS/ItemOperations
|
||||
|
||||
Bug fixes
|
||||
- fixed calendar selection in event and task editors (#3049, #3050)
|
||||
- check for resources existence when listing subscribed ones (#3054)
|
||||
- correctly recognize Apple Calendar on Yosemite (#2960)
|
||||
- fixed two potential autorelease pool leaks (#3026 and #3051)
|
||||
- fixed birthday offset in EAS
|
||||
- fixed From's full name over EAS
|
||||
- fixed potential issue when handling multiple Add/Change/Delete/Fetch EAS commands (#3057)
|
||||
- fixed wrong timezone calculation on recurring events
|
||||
|
||||
2.2.13 (2014-12-30)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- initial support for empty sync request/response for EAS
|
||||
- added the SOGoMaximumSyncResponseSize EAS configuration parameter to
|
||||
support memory-limited sync response sizes
|
||||
- we now not only use the creation date for event's cutoff date (EAS)
|
||||
|
||||
Bug fixes
|
||||
- fixed contact description truncation on WP8 phones (#3028)
|
||||
- fixed freebusy information not always returned
|
||||
- fixed tz issue when the user one was different from the system one with EAS
|
||||
|
||||
2.2.12a (2014-12-19)
|
||||
--------------------
|
||||
|
||||
Bug fixes
|
||||
- fixed empty HTML mails being sent (#3034)
|
||||
|
||||
2.2.12 (2014-12-18)
|
||||
-------------------
|
||||
|
||||
New features
|
||||
- allow including or not freebusy info from subscribed calendars
|
||||
- now possible to set an autosave timer for draft messages
|
||||
- now possible to set alarms on event invitations (#76)
|
||||
|
||||
Enhancements
|
||||
- updated CKEditor to version 4.4.6 and added the 'Source Area' plugin
|
||||
- avoid testing for IMAP ANNOTATION when X-GUID is available (#3018)
|
||||
- updated Czech, Dutch, Finnish, French, German, Polish and Spanish (Spain) translations
|
||||
|
||||
Bug fixes
|
||||
- fixed for privacy and categories for EAS (#3022)
|
||||
- correctly set MeetingStatus for EAS on iOS devices
|
||||
- Ubuntu Lucid fixes for EAS
|
||||
- fixed calendar reminders for future events (#3008)
|
||||
- make sure all text parts are UTF-8 re-encoded for Outlook 2013 over EAS (#3003)
|
||||
- fixed task description truncation affecting WP8 phones over EAS (#3028)
|
||||
|
||||
2.2.11a (2014-12-10)
|
||||
--------------------
|
||||
|
||||
Bug fixes
|
||||
- make sure all address books returned using EAS are GCS ones
|
||||
|
||||
2.2.11 (2014-12-09)
|
||||
-------------------
|
||||
|
||||
New features
|
||||
- sogo-tool can now be used to manage EAS metadata for all devices
|
||||
|
||||
Enhancements
|
||||
- improved the SAML2 documentation
|
||||
- radically reduced AES memory usage
|
||||
|
||||
Bug fixes
|
||||
- now possible to specify the username attribute for SAML2 (SOGoSAML2LoginAttribute) (#2381)
|
||||
- added support for IdP-initiated SAML2 logout (#2377)
|
||||
- we now generate SAML2 metadata on the fly (#2378)
|
||||
- we now handle correctly the SOGo logout when using SAML (#2376 and #2379)
|
||||
- fixed freebusy lookups going off bounds for resources (#3010)
|
||||
- fixed EAS clients moving mails between folders but disconnecting before receiving server's response (#2982)
|
||||
|
||||
2.2.10 (2014-11-21)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- no longer leaking database passwords in the logs (#2953)
|
||||
- added support for multiple calendars and address books over ActiveSync
|
||||
- updated timezone information (#2968)
|
||||
- updated Brazilian Portuguese, Czech, Dutch, Finnish, French, German, Hungarian, Polish,
|
||||
Russian, Spanish (Argentina), and Spanish (Spain) translations
|
||||
- updated CKEditor to version 4.4.5
|
||||
|
||||
Bug fixes
|
||||
- fixed freebusy lookup with "Show time as busy" (#2930)
|
||||
- don't escape <br>'s in a card's note field
|
||||
- fixed folder's display name when subscribing to a folder
|
||||
- fixed folder's display name when the active user subscribes another user to one of her/his folders
|
||||
- fixed error with new user default sorting value for the mailer module (#2952)
|
||||
- fixed ActiveSync PING command flooding the server (#2940)
|
||||
- fixed many interop issues with Windows Phones over ActiveSync
|
||||
- fixed automatic return receipts crash when not in the recepient list (#2965)
|
||||
- fixed support for Sieve folder encoding parameter (#2622)
|
||||
- fixed rename of subscribed addressbooks
|
||||
- sanitize strings before escaping them when using EAS
|
||||
- fixed handling of event invitations on iOS/EAS with no organizer (#2978)
|
||||
- fixed corrupted png files (#2975)
|
||||
- improved dramatically the BSON decoding speed
|
||||
- added WindowSize support for GCS collections when using EAS
|
||||
- fixed IMAP search with non-ASCII folder names
|
||||
- fixed extraction of email addresses when pasting text with tabs (#2945)
|
||||
- fixed Outlook attachment corruption issues when using AES (#2957)
|
||||
|
||||
2.2.9a (2014-09-29)
|
||||
-------------------
|
||||
|
||||
Bug fixes
|
||||
- correctly skip unallowed characters (#2936)
|
||||
|
||||
2.2.9 (2014-09-26)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- support for recurrent tasks (#2160)
|
||||
- support for alarms on recurrent events / tasks
|
||||
|
||||
Enhancements
|
||||
- alarms can now be snoozed for 1 day
|
||||
- better iOS/Mac OS X Calendar compability regarding alarms (#1920)
|
||||
- force default classification over CalDAV if none is set (#2326)
|
||||
- now compliant when handling completed tasks (#589)
|
||||
- better iOS invitations handling regarding part state (#2852)
|
||||
- fixed Mac OS X Calendar delegation issue (#2837)
|
||||
- converted ODT documentation to AsciiDoc format
|
||||
- updated Czech, Dutch, Finnish, French, German, Hungarian, Norwegian (Bokmal), Polish, Russian, and
|
||||
Spanish (Spain) translations
|
||||
|
||||
Bug fixes
|
||||
- fixed sending mails to multiple recipients over AS
|
||||
- fixed freebusy support in iCal 7 and free/busy state changes (#2878, #2879)
|
||||
- we now get rid of all potential control characters before sending the DAV response
|
||||
- sync-token can now be returned during PROPFIND (#2493)
|
||||
- fixed calendar deletion on iOS/Mac OS Calendar (#2838)
|
||||
|
||||
2.2.8 (2014-09-10)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- new user settings for threads collapsing
|
||||
- IMAP global search support (#2670)
|
||||
|
||||
Enhancements
|
||||
- major refactoring of the GCS component saving code (dropped OGoContentStore)
|
||||
- printing calendars in colors is now possible in all views; list, daily, weekly and multicolumns
|
||||
- new option to print calendars events and tasks with a background color or with a border color
|
||||
- labels tagging only make one AJAX call for all the selected messages instead of one AJAX call per message
|
||||
- new option to print calendars events and tasks with a background color or with a border color
|
||||
- all modules can now be automatically refreshed
|
||||
- new configurable user defaults variables; SOGoRefreshViewCheck & SOGoRefreshViewIntervals. SOGoMailMessageCheck has
|
||||
been replaced by SOGoRefreshViewCheck and SOGoMailPollingIntervals has been replaced by SOGoRefreshViewIntervals
|
||||
- updated Catalan, Czech, Dutch, Finnish, French, Hungarian, Norwegian, and Polish translations
|
||||
|
||||
Bug fixes
|
||||
- fixed crasher when subscribing users to resources (#2892)
|
||||
- fixed encoding of new calendars and new subscriptions (JavaScript only)
|
||||
- fixed display of users with no possible subscription
|
||||
- fixed usage of SOGoSubscriptionFolderFormat domain default when the folder's name hasn't been changed
|
||||
- fixed "sogo-tool restore -l" that was returning incorrect folder IDs
|
||||
- fixed Can not delete mail when over quota (#2812)
|
||||
- fixed Events and tasks cannot be moved to other calendars using drag&drop (#2759)
|
||||
- fixed In "Multicolumn Day View" mouse position is not honored when creating an event (#2864)
|
||||
- fixed handling of messages labels (#2902)
|
||||
- fixed Apache > 2.3 configuration
|
||||
- fixed freebusy retrieval during timezone changes (#1240)
|
||||
|
||||
2.2.7 (2014-07-30)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- new user preference to prevent event invitations
|
||||
|
||||
Enhancements
|
||||
- improved badges of active tasks count
|
||||
- refresh draft folder after sending a message
|
||||
- now possible to DnD events in the calendar list
|
||||
- improved handling of SOGoSubscriptionFolderFormat
|
||||
- JSON'ified folder subscription interface
|
||||
- updated Finnish, French, German, and Spanish (Spain) translations
|
||||
- updated CKEditor to version 4.4.3
|
||||
|
||||
Bug fixes
|
||||
- fixed weekdays translation in the datepicker
|
||||
- fixed event categories display
|
||||
- fixed all-day events display in IE
|
||||
- fixed rename of calendars
|
||||
- we now correctly add the "METHOD:REPLY" when sending out ITIP messages from DAV clients
|
||||
- fixed refresh of message headers when forwarding a message (#2818)
|
||||
- we now correctly escape all charset= in <meta> tags, not only in the <head>
|
||||
- we now destroy cache objects of vanished folders
|
||||
|
||||
2.2.6 (2014-07-02)
|
||||
------------------
|
||||
|
||||
New features
|
||||
- add new 'multi-columns' calendar view (#1948)
|
||||
|
||||
Enhancements
|
||||
- contacts photos are now synchronized using ActiveSync (#2807)
|
||||
- implemented the GetAttachment ActiveSync command (#2808)
|
||||
- implemented the Ping ActiveSync command
|
||||
- added "soft deletes" support for ActiveSync (#2734)
|
||||
- now display the active tasks count next to calendar names (#2760)
|
||||
|
||||
Bug fixes
|
||||
- better handling of empty "Flag" messages over ActiveSync (#2806)
|
||||
- fixed Chinese charset handling (#2809)
|
||||
- fixed folder name (calendars and contacts) of new subscriptions (#2801)
|
||||
- fixed the reply/forward operation over ActiveSync (#2805)
|
||||
- fixed regression when attaching files to a reply
|
||||
- wait 20 seconds (instead of 2) before deleting temporary download forms (#2811)
|
||||
- avoid raising exceptions when the db is down and we try to access the preferences module (#2813)
|
||||
- we now ignore the SCHEDULE-AGENT property when Thunderbird/Lightning sends it to avoid
|
||||
not-generating invitation responses for externally received IMIP messages
|
||||
- improved charset handling over ActiveSync (#2810)
|
||||
|
||||
2.2.5 (2014-06-05)
|
||||
------------------
|
||||
|
||||
|
||||
@@ -0,0 +1,482 @@
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for
|
||||
your libraries, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if
|
||||
you distribute copies of the library, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide
|
||||
complete object files to the recipients so that they can relink them
|
||||
with the library, after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright
|
||||
the library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
library. If the library is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original
|
||||
version, so that any problems introduced by others will not reflect on
|
||||
the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this,
|
||||
we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary
|
||||
GNU General Public License, which was designed for utility programs. This
|
||||
license, the GNU Library General Public License, applies to certain
|
||||
designated libraries. This license is quite different from the ordinary
|
||||
one; be sure to read it in full, and don't assume that anything in it is
|
||||
the same as in the ordinary license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that
|
||||
they blur the distinction we usually make between modifying or adding to a
|
||||
program and simply using it. Linking a program with a library, without
|
||||
changing the library, is in some sense simply using the library, and is
|
||||
analogous to running a utility program or application program. However, in
|
||||
a textual and legal sense, the linked executable is a combined work, a
|
||||
derivative of the original library, and the ordinary General Public License
|
||||
treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended to
|
||||
permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to achieve
|
||||
this as regards changes in header files, but we have achieved it as regards
|
||||
changes in the actual functions of the Library.) The hope is that this
|
||||
will lead to faster development of free libraries.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.
|
||||
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which
|
||||
contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Library
|
||||
General Public License (also called "this License"). Each licensee is
|
||||
addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also compile or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
c) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
d) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Library General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
@@ -0,0 +1,34 @@
|
||||
# GNUstep makefile
|
||||
|
||||
include ../config.make
|
||||
include $(GNUSTEP_MAKEFILES)/common.make
|
||||
include ./Version
|
||||
|
||||
LIBRARY_NAME = libOGoContentStore
|
||||
|
||||
TYPEMODELS_DIR = $(SOGO_TYPEMODELS)
|
||||
|
||||
libOGoContentStore_HEADER_FILES_DIR = .
|
||||
libOGoContentStore_HEADER_FILES_INSTALL_DIR = /OGoContentStore
|
||||
libOGoContentStore_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
|
||||
|
||||
ADDITIONAL_INCLUDE_DIRS += -I../SOPE
|
||||
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj
|
||||
|
||||
libOGoContentStore_OBJC_FILES += \
|
||||
OCSiCalFieldExtractor.m \
|
||||
OCSContactFieldExtractor.m \
|
||||
|
||||
libOGoContentStore_TYPEMODELS += \
|
||||
appointment.ocs \
|
||||
contact.ocs \
|
||||
appointment-oracle.ocs \
|
||||
contact-oracle.ocs
|
||||
|
||||
-include GNUmakefile.preamble
|
||||
ifneq ($(FHS_INSTALL_ROOT),)
|
||||
GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include
|
||||
endif
|
||||
include $(GNUSTEP_MAKEFILES)/library.make
|
||||
include $(GNUSTEP_MAKEFILES)/tool.make
|
||||
-include GNUmakefile.postamble
|
||||
Loaded 100 of 2069 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user