From fd1c518f40406792f6b9eab4ee843d36ee45547c Mon Sep 17 00:00:00 2001 From: ksainc Date: Mon, 25 Dec 2023 05:34:53 -0500 Subject: [PATCH] Removal of EAS specific functionality and references --- README.md | 4 +- lib/Commands/Connect.php | 12 +- lib/Commands/Disconnect.php | 4 +- lib/Notification/Notifier.php | 2 +- lib/Service/Remote/RemoteCommonService.php | 1026 +----------------- lib/Service/Remote/RemoteEventsService.php | 6 +- lib/Tasks/EAS-Calendar-Create | Bin 652 -> 0 bytes lib/Tasks/Test.php | 41 - lib/Utile/Eas/EasAuthenticationBasic.php | 37 - lib/Utile/Eas/EasAuthenticationBearer.php | 39 - lib/Utile/Eas/EasClient.php | 633 ----------- lib/Utile/Eas/EasCollection.php | 46 - lib/Utile/Eas/EasException.php | 152 --- lib/Utile/Eas/EasLocator.php | 898 ---------------- lib/Utile/Eas/EasObject.php | 46 - lib/Utile/Eas/EasProperty.php | 70 -- lib/Utile/Eas/EasTypes.php | 63 -- lib/Utile/Eas/EasXml.php | 62 -- lib/Utile/Eas/EasXmlDecoder.php | 1097 -------------------- lib/Utile/Eas/EasXmlEncoder.php | 1053 ------------------- lib/Utile/TimeZoneEAS.php | 951 ----------------- src/components/AdminSettings.vue | 78 +- src/components/UserSettings.vue | 99 +- src/components/icons/EwsIcon.vue | 4 +- 24 files changed, 68 insertions(+), 6355 deletions(-) delete mode 100644 lib/Tasks/EAS-Calendar-Create delete mode 100644 lib/Utile/Eas/EasAuthenticationBasic.php delete mode 100644 lib/Utile/Eas/EasAuthenticationBearer.php delete mode 100644 lib/Utile/Eas/EasClient.php delete mode 100644 lib/Utile/Eas/EasCollection.php delete mode 100644 lib/Utile/Eas/EasException.php delete mode 100644 lib/Utile/Eas/EasLocator.php delete mode 100644 lib/Utile/Eas/EasObject.php delete mode 100644 lib/Utile/Eas/EasProperty.php delete mode 100644 lib/Utile/Eas/EasTypes.php delete mode 100644 lib/Utile/Eas/EasXml.php delete mode 100644 lib/Utile/Eas/EasXmlDecoder.php delete mode 100644 lib/Utile/Eas/EasXmlEncoder.php delete mode 100644 lib/Utile/TimeZoneEAS.php diff --git a/README.md b/README.md index 6de65c6..9c382f9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# integration_jmap -Nextcloud Exchange JMAP Integration +# integration_jmapc +Nextcloud JMAP Integration diff --git a/lib/Commands/Connect.php b/lib/Commands/Connect.php index 3e4cc74..d5f40b8 100644 --- a/lib/Commands/Connect.php +++ b/lib/Commands/Connect.php @@ -45,22 +45,22 @@ public function __construct(IUserManager $userManager, CoreService $CoreService) protected function configure() { $this ->setName('jmapc:connect') - ->setDescription('Connects a user to EWS Server') + ->setDescription('Connects a user to JMAP Server') ->addArgument('user', InputArgument::REQUIRED, - 'User whom to connect to the EWS Server') + 'User whom to connect to the JMAP Server') ->addArgument('provider', InputArgument::REQUIRED, - 'FQDN or IP address of the EWS Server') + 'FQDN or IP address of the JMAP Server') ->addArgument('accountid', InputArgument::REQUIRED, - 'The username of the account to connect to on the EWS Server') + 'The username of the account to connect to on the JMAP Server') ->addArgument('accountsecret', InputArgument::REQUIRED, - 'The password of the account to connect to on the EWS Server') + 'The password of the account to connect to on the JMAP Server') ->addArgument('validate', InputArgument::OPTIONAL, - 'Should we validate the credentials with EWS Server. (default true)'); + 'Should we validate the credentials with JMAP Server. (default true)'); } /** diff --git a/lib/Commands/Disconnect.php b/lib/Commands/Disconnect.php index 0f2eba0..faf2044 100644 --- a/lib/Commands/Disconnect.php +++ b/lib/Commands/Disconnect.php @@ -45,7 +45,7 @@ public function __construct(IUserManager $userManager, CoreService $CoreService) protected function configure() { $this ->setName('jmapc:disconnect') - ->setDescription('Disconnects a user from an EWS Server') + ->setDescription('Disconnects a user from an JMAP Server') ->addArgument('user', InputArgument::REQUIRED, 'User whom to disconnect'); @@ -65,7 +65,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->CoreService->disconnectAccount($uid); - $output->writeln("User $uid disconnected from EWS Server"); + $output->writeln("User $uid disconnected from JMAP Server"); return 0; diff --git a/lib/Notification/Notifier.php b/lib/Notification/Notifier.php index b6a937e..6f656ad 100644 --- a/lib/Notification/Notifier.php +++ b/lib/Notification/Notifier.php @@ -80,7 +80,7 @@ public function getID(): string { * @since 17.0.0 */ public function getName(): string { - return $this->factory->get('integration_jmapc')->t('EWS Connector'); + return $this->factory->get('integration_jmapc')->t('JMAP Connector'); } /** diff --git a/lib/Service/Remote/RemoteCommonService.php b/lib/Service/Remote/RemoteCommonService.php index 50f5acc..ef0513e 100644 --- a/lib/Service/Remote/RemoteCommonService.php +++ b/lib/Service/Remote/RemoteCommonService.php @@ -31,1043 +31,19 @@ use Psr\Log\LoggerInterface; use OCA\JMAPC\AppInfo\Application; -use OCA\JMAPC\Utile\Eas\EasClient; -use OCA\JMAPC\Utile\Eas\EasXmlEncoder; -use OCA\JMAPC\Utile\Eas\EasXmlDecoder; -use OCA\JMAPC\Utile\Eas\EasObject; -use OCA\JMAPC\Utile\Eas\EasCollection; -use OCA\JMAPC\Utile\Eas\EasProperty; -use OCA\JMAPC\Utile\Eas\EasException; -use OCA\JMAPC\Utile\Eas\EasTypes; class RemoteCommonService { private LoggerInterface $logger; - private EasXmlEncoder $_encoder; - private EasXmlDecoder $_decoder; /** - * Service to construct basic EAS commands + * Service to construct basic commands */ public function __construct (string $appName, LoggerInterface $logger) { $this->logger = $logger; - $this->_encoder = new EasXmlEncoder(); - $this->_decoder = new EasXmlDecoder(); } - - /** - * retrieve list of all folders starting with root folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage interface - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function provisionInit(EasClient $DataStore, string $model, string $name, string $agent): EasObject | null { - - // construct provision command - $o = new \stdClass(); - $o->Provision = new EasObject('Provision'); - $o->Provision->Device = new EasObject('Settings'); - $o->Provision->Device->Set = new EasObject('Settings'); - $o->Provision->Device->Set->Model = new EasProperty('Settings', $model); - $o->Provision->Device->Set->FriendlyName = new EasProperty('Settings', $name); - $o->Provision->Device->Set->UserAgent = new EasProperty('Settings', $agent); - $o->Provision->Policies = new EasObject('Provision'); - $o->Provision->Policies->Policy = new EasObject('Provision'); - $o->Provision->Policies->Policy->PolicyType = new EasProperty('Provision', 'MS-EAS-Provisioning-WBXML'); - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performProvision($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - - switch ($o->Provision->Status->getContents()) { - case '2': - throw new Exception("Protocol error.", 2); - break; - case '3': - throw new Exception("General server error.", 3); - break; - } - - return $o->Provision; - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve list of all folders starting with root folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage interface - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function provisionAccept(EasClient $DataStore, string $token): EasObject | null { - - // construct provision command - $o = new \stdClass(); - $o->Provision = new EasObject('Provision'); - $o->Provision->Policies = new EasObject('Provision'); - $o->Provision->Policies->Policy = new EasObject('Provision'); - $o->Provision->Policies->Policy->PolicyType = new EasProperty('Provision', 'MS-EAS-Provisioning-WBXML'); - $o->Provision->Policies->Policy->PolicyKey = new EasProperty('Provision', $token); - $o->Provision->Policies->Policy->Status = new EasProperty('Provision', '1'); - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performProvision($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - - switch ($o->Provision->Status->getContents()) { - case '2': - throw new Exception("Protocol error.", 2); - break; - case '3': - throw new Exception("General server error.", 3); - break; - } - - return $o->Provision; - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve list of all folders starting with root folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage interface - * @param string $cst Signature State Token - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function syncCollections(EasClient $DataStore, string $cst = '0'): EasObject | null { - - // construct command - $o = new \stdClass(); - $o->CollectionSync = new EasObject('CollectionHierarchy'); - $o->CollectionSync->SyncKey = new EasProperty('CollectionHierarchy', $cst); - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performCollectionSync($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if ($o->CollectionSync->Status->getContents() != '1' && $o->CollectionSync->Status->getContents() != '142') { - throw new Exception("CollectionSync: Unknow error occured" . $o->CollectionSync->Status->getContents(), 1); - } - // return response message - return $o->CollectionSync; - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve all information for specific folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection ID - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function fetchCollection(EasClient $DataStore, string $cid): EasObject | null { - - return null; - - } - - /** - * create collection in remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $chs Collections Hierarchy Signature Token - * @param string $chl Collections Hierarchy Location - * @param string $name Collection Name - * @param int $type Collection Type - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function createCollection(EasClient $DataStore, string $chs, string $chl, string $name, int $type): EasObject | null { - - // construct command - $o = new \stdClass(); - $o->CollectionCreate = new EasObject('CollectionHierarchy'); - $o->CollectionCreate->SyncKey = new EasProperty('CollectionHierarchy', $chs); - $o->CollectionCreate->ParentId = new EasProperty('CollectionHierarchy', $chl); - $o->CollectionCreate->Name = new EasProperty('CollectionHierarchy', $name); - $o->CollectionCreate->Type = new EasProperty('CollectionHierarchy', $type); - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performCollectionCreate($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if ($o->CollectionCreate->Status->getContents() != '1' && $o->CollectionCreate->Status->getContents() != '110') { - throw new EasException($o->CollectionCreate->Status->getContents(), 'CC'); - } - // return response object - return $o->CollectionCreate; - } - else { - // return blank response - return null; - } - - } - - /** - * update collection in remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $chs Collections Hierarchy Signature Token - * @param string $chl Collections Hierarchy Location - * @param string $cid Collection Id - * @param string $name Collection Name - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function updateCollection(EasClient $DataStore, string $chs, string $chl, string $cid, string $name): EasObject | null { - - // construct command - $o = new \stdClass(); - $o->CollectionUpdate = new EasObject('CollectionHierarchy'); - $o->CollectionUpdate->SyncKey = new EasProperty('CollectionHierarchy', $chs); - $o->CollectionUpdate->Id = new EasProperty('CollectionHierarchy', $cid); - $o->CollectionUpdate->ParentId = new EasProperty('CollectionHierarchy', $chl); - $o->CollectionUpdate->Name = new EasProperty('CollectionHierarchy', $name); - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performCollectionUpdate($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if ($o->CollectionUpdate->Status->getContents() != '1' && $o->CollectionUpdate->Status->getContents() != '110') { - throw new EasException($o->CollectionUpdate->Status->getContents(), 'CU'); - } - // return response object - return $o->CollectionUpdate; - } - else { - // return blank response - return null; - } - - } - - /** - * delete collection from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $chs Collections Hierarchy Signature Token - * @param string $cid Collection Id - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function deleteCollection(EasClient $DataStore, string $chs, string $cid): EasObject | null { - - // construct command - $o = new \stdClass(); - $o->CollectionDelete = new EasObject('CollectionHierarchy'); - $o->CollectionDelete->SyncKey = new EasProperty('CollectionHierarchy', $chs); - $o->CollectionDelete->Id = new EasProperty('CollectionHierarchy', $cid); - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performCollectionDelete($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if ($o->CollectionDelete->Status->getContents() != '1' && $o->CollectionDelete->Status->getContents() != '110') { - throw new EasException($o->CollectionDelete->Status->getContents(), 'CD'); - } - // return response object - return $o->CollectionDelete; - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve list of entities for specific folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection Id - * @param string $cst Collections Signature Token - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function reconcileCollection(EasClient $DataStore, string $cst, string $cid, array $options = []): EasObject | null { - - // construct Sync request - $o = new \stdClass(); - $o->Sync = new EasObject('AirSync'); - $o->Sync->Collections = new EasObject('AirSync'); - $o->Sync->Collections->Collection = new EasObject('AirSync'); - $o->Sync->Collections->Collection->SyncKey = new EasProperty('AirSync', $cst); - $o->Sync->Collections->Collection->CollectionId = new EasProperty('AirSync', $cid); - - if (isset($options['SUPPORTED']) && $options['SUPPORTED'] == true) { - $o->Sync->Collections->Collection->Supported = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Supported->Picture = new EasProperty('Contacts', null); - } - if (isset($options['CHANGES'])) { - $o->Sync->Collections->Collection->GetChanges = new EasProperty('AirSync', $options['CHANGES']); - } - if (isset($options['LIMIT'])) { - $o->Sync->Collections->Collection->WindowSize = new EasProperty('AirSync', $options['LIMIT']); - } - if (isset($options['FILTER']) && isset($options['BODY'])) { - $o->Sync->Collections->Collection->Options = new EasObject('AirSync'); - - if (isset($options['FILTER'])) { - $o->Sync->Collections->Collection->Options->FilterType = new EasProperty('AirSync', $options['FILTER']); - } - if (isset($options['BODY'])) { - if ($options['BODY'] == EasTypes::BODY_TYPE_MIME) { - $o->Sync->Collections->Collection->Options->MIMESupport = new EasProperty('AirSync', 2); - $o->Sync->Collections->Collection->Options->MIMETruncation = new EasProperty('AirSync', 8); - } - $o->Sync->Collections->Collection->Options->BodyPreference = new EasObject('AirSyncBase'); - $o->Sync->Collections->Collection->Options->BodyPreference->Type = new EasProperty('AirSyncBase', $options['BODY']); - $o->Sync->Collections->Collection->Options->BodyPreference->AllOrNone = new EasProperty('AirSyncBase', 1); - } - } - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntitySync($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->Sync->Status) && $o->Sync->Status->getContents() != '1' && $o->Sync->Status->getContents() != '142') { - throw new EasException($o->Sync->Status->getContents(), 'ES'); - } - elseif (isset($o->Sync->Status) && $o->Sync->Status->getContents() == '142') { - // return response object - return $o->Sync; - } - else { - // return response object - return $o->Sync->Collections->Collection; - } - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve list of entities for specific folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param array $collections Collections List (cid, cst) - * - * @return EasObject|array|null Array on success / Null on failure - */ - public function reconcileCollectionVarious(EasClient $DataStore, array $collections, array $options = []): EasObject | array | null { - - // construct Sync request - $o = new \stdClass(); - $o->Sync = new EasObject('AirSync'); - $o->Sync->Collections = new EasObject('AirSync'); - $o->Sync->Collections->Collection = new EasCollection('AirSync'); - - foreach ($collections as $entry) { - if (isset($entry['cid']) && isset($entry['cst'])) { - $c = new EasObject('AirSync'); - $c->SyncKey = new EasProperty('AirSync', $entry['cst']); - $c->CollectionId = new EasProperty('AirSync', $entry['cid']); - $o->Sync->Collections->Collection[] = $c; - } - } - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntitySync($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate, if status is anything else other than 1 or 142 - if (isset($o->Sync->Status) && $o->Sync->Status->getContents() != '1' && $o->Sync->Status->getContents() != '142') { - throw new EasException($o->Sync->Status->getContents(), 'ES'); - } - // evaluate, if status is 142 - elseif (isset($o->Sync->Status) && $o->Sync->Status->getContents() == '142') { - // return response object - return $o->Sync; - } - // evaluate, if response returned an array - elseif (!is_array($o->Sync->Collections->Collection)) { - // return response array - return [$o->Sync->Collections->Collection]; - } - else { - // return response array - return $o->Sync->Collections->Collection; - } - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve list of all folders starting with root folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection Id - * @param string $cst Collections Signature Token - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function estimateEntities(EasClient $DataStore, string $cst, string $cid): EasObject | null { - - // construct EntityEstimate request - $o = new \stdClass(); - $o->EntityEstimate = new EasObject('EntityEstimate'); - $o->EntityEstimate->Collections = new EasObject('EntityEstimate'); - $o->EntityEstimate->Collections->Collection = new EasObject('EntityEstimate'); - $o->EntityEstimate->Collections->Collection->SyncKey = new EasProperty('AirSync', $cst); - $o->EntityEstimate->Collections->Collection->CollectionId = new EasProperty('EntityEstimate', $cid); - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntityEstimate($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->EntityEstimate->Status) && $o->EntityEstimate->Status->getContents() != '1') { - throw new EasException($o->EntityEstimate->Status->getContents(), 'ES'); - } - // return response message - return $o->EntityEstimate->Response; - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve list of all folders starting with root folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param array $collections Collections List (cid, cst) - * - * @return array|null Array on success / Null on failure - */ - public function estimateEntitiesVarious(EasClient $DataStore, array $collections): array | null { - // construct EntityEstimate request - $o = new \stdClass(); - $o->EntityEstimate = new EasObject('EntityEstimate'); - $o->EntityEstimate->Collections = new EasObject('EntityEstimate'); - $o->EntityEstimate->Collections->Collection = new EasCollection('EntityEstimate'); - - foreach ($collections as $entry) { - if (isset($entry['cid']) && isset($entry['cst'])) { - $c = new EasObject('EntityEstimate'); - $c->SyncKey = new EasProperty('AirSync', $entry['cst']); - $c->CollectionId = new EasProperty('EntityEstimate', $entry['cid']); - $o->EntityEstimate->Collections->Collection[] = $c; - } - } - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntityEstimate($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->EntityEstimate->Status) && $o->EntityEstimate->Status->getContents() != '1') { - throw new EasException($o->EntityEstimate->Status->getContents(), 'ES'); - } - // evaluate, if response returned an array - if (!is_array($o->EntityEstimate->Response)) { - // return response array - return [$o->EntityEstimate->Response]; - } - else { - // return response array - return $o->EntityEstimate->Response; - } - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve list of all folders starting with root folder from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection Id - * @param string $value Search value - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function searchEntities(EasClient $DataStore, string $cid, string $query, array $options = []): EasObject | null { - - // construct EntityEstimate request - $o = new \stdClass(); - $o->Search = new EasObject('Search'); - $o->Search->Store = new EasObject('Search'); - // evaluate, if store option is present - if (isset($options['STORE']) && $options['STORE'] == 'GAL') { - $o->Search->Store->Name = new EasProperty('Search', 'GAL'); - $o->Search->Store->Query = new EasProperty('Search', $query); - } - else { - $o->Search->Store->Name = new EasProperty('Search', 'Mailbox'); - $o->Search->Store->Query = new EasObject('Search'); - $o->Search->Store->Query->And = new EasObject('Search'); - // evaluate, if category option is present - if (isset($options['CATEGORY']) && $options['CATEGORY'] == 'CLS') { - $o->Search->Store->Query->And->Class = new EasProperty('AirSync', $cid); - $options['BROAD'] = true; - } - elseif (isset($options['CATEGORY']) && $options['CATEGORY'] == 'CVS') { - $o->Search->Store->Query->And->ConversationId = new EasProperty('AirSync', $cid); - } - else { - $o->Search->Store->Query->And->CollectionId = new EasProperty('AirSync', $cid); - } - $o->Search->Store->Query->And->FreeText = new EasProperty('Search', $query); - } - - $o->Search->Store->Options = new EasObject('Search'); - $o->Search->Store->Options->RebuildResults = new EasProperty('Search', null); - // evaluate, if range option is present - if (isset($options['RANGE'])) { - $o->Search->Store->Options->Range = new EasProperty('Search', $options['RANGE']); - } - else { - $o->Search->Store->Options->Range = new EasProperty('Search', '0-99'); - } - // evaluate, if broad option is present - if (isset($options['BROAD']) && $options['BROAD'] == true) { - $o->Search->Store->Options->DeepTraversal = new EasProperty('Search', null); - } - // evaluate, if body option is present - if (isset($options['BODY'])) { - if ($options['BODY'] == EasTypes::BODY_TYPE_MIME) { - $o->Search->Store->Options->MIMESupport = new EasProperty('AirSync', 2); - } - $o->Search->Store->Options->BodyPreference = new EasObject('AirSyncBase'); - $o->Search->Store->Options->BodyPreference->Type = new EasProperty('AirSyncBase', $options['BODY']); - $o->Search->Store->Options->BodyPreference->AllOrNone = new EasProperty('AirSyncBase', 1); - } - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntitySearch($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->Search->Status) && $o->Search->Status->getContents() != '1') { - throw new EasException($o->Search->Status->getContents(), 'FN'); - } - // return response message - return $o->Search->Response->Store; - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve all information for specific entity from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection Id - * @param string $eid Entity Id - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function fetchEntity(EasClient $DataStore, string $cid, string $eid, array $options = []): EasObject | null { - - // construct Entityoperation request - $o = new \stdClass(); - $o->EntityOperations = new EasObject('EntityOperations'); - $o->EntityOperations->Fetch = new EasObject('EntityOperations'); - $o->EntityOperations->Fetch->Store = new EasProperty('EntityOperations', 'Mailbox'); - $o->EntityOperations->Fetch->EntityId = new EasProperty('AirSync', $eid); - $o->EntityOperations->Fetch->CollectionId = new EasProperty('AirSync', $cid); - - if (isset($options['BODY'])) { - $o->EntityOperations->Fetch->Options = new EasObject('EntityOperations'); - if ($options['BODY'] == EasTypes::BODY_TYPE_MIME) { - $o->EntityOperations->Fetch->Options->MIMESupport = new EasProperty('AirSync', 2); - //$o->EntityOperations->Fetch->Options->MIMETruncation = new EasProperty('AirSync', 8); - } - $o->EntityOperations->Fetch->Options->BodyPreference = new EasObject('AirSyncBase'); - $o->EntityOperations->Fetch->Options->BodyPreference->Type = new EasProperty('AirSyncBase', $options['BODY']); - $o->EntityOperations->Fetch->Options->BodyPreference->AllOrNone = new EasProperty('AirSyncBase', 1); - } - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntityOperation($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->EntityOperations->Status) && $o->EntityOperations->Status->getContents() != '1') { - throw new EasException($o->EntityOperations->Status->getContents(), 'EF'); - } - // return response message - return $o->EntityOperations->Response->Fetch; - } - else { - // return blank response - return null; - } - - } - - /** - * create entity in remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection Id - * @param string $cst Collection Signature Token - * @param string $type Entity Type - * @param EasObject $data Entity Data - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function createEntity(EasClient $DataStore, string $cid, string $cst, string $type, EasObject $data): EasObject | null { - - // construct Sync request - $o = new \stdClass(); - $o->Sync = new EasObject('AirSync'); - $o->Sync->Collections = new EasObject('AirSync'); - $o->Sync->Collections->Collection = new EasObject('AirSync'); - $o->Sync->Collections->Collection->SyncKey = new EasProperty('AirSync', $cst); - $o->Sync->Collections->Collection->CollectionId = new EasProperty('AirSync', $cid); - $o->Sync->Collections->Collection->DeletesAsMoves = new EasProperty('AirSync', null); - $o->Sync->Collections->Collection->GetChanges = new EasProperty('AirSync', null); - $o->Sync->Collections->Collection->WindowSize = new EasProperty('AirSync', 32); - $o->Sync->Collections->Collection->Options = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Options->FilterType = new EasProperty('AirSync', 0); - $o->Sync->Collections->Collection->Options->BodyPreference = new EasObject('AirSyncBase'); - $o->Sync->Collections->Collection->Options->BodyPreference->Type = new EasProperty('AirSyncBase', 1); - $o->Sync->Collections->Collection->Options->BodyPreference->TruncationSize = new EasProperty('AirSyncBase', 512000); - $o->Sync->Collections->Collection->Commands = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Commands->Add = new EasObject('AirSync'); - //$o->Sync->Collections->Collection->Commands->Add->Class = new EasProperty('AirSync', $type); - $o->Sync->Collections->Collection->Commands->Add->ClientId = new EasProperty('AirSync', \OCA\JMAPC\Utile\UUID::v4()); - $o->Sync->Collections->Collection->Commands->Add->Data = $data; - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - - // execute request - $rs = $DataStore->performEntitySync($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->Sync->Status) && $o->Sync->Status->getContents() != '1') { - throw new EasException($o->Sync->Status->getContents(), 'EC'); - } - // evaluate response status - elseif (isset($o->Sync->Collections->Collection) && $o->Sync->Collections->Collection->Status->getContents() != '1') { - throw new EasException($o->Sync->Collections->Collection->Status->getContents(), 'EC'); - } - else { - // return response message - return $o->Sync->Collections->Collection; - } - } - else { - // return blank response - return null; - } - - } - - /** - * update item in remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection Id - * @param string $cst Collection Signature Token - * @param string $eid Entity Id - * @param EasObject $data Entity Data - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function updateEntity(EasClient $DataStore, string $cid, string $cst, string $eid, EasObject $data): EasObject | null { - - // construct Sync request - $o = new \stdClass(); - $o->Sync = new EasObject('AirSync'); - $o->Sync->Collections = new EasObject('AirSync'); - $o->Sync->Collections->Collection = new EasObject('AirSync'); - $o->Sync->Collections->Collection->SyncKey = new EasProperty('AirSync', $cst); - $o->Sync->Collections->Collection->CollectionId = new EasProperty('AirSync', $cid); - $o->Sync->Collections->Collection->DeletesAsMoves = new EasProperty('AirSync', 0); - $o->Sync->Collections->Collection->GetChanges = new EasProperty('AirSync', 0); - $o->Sync->Collections->Collection->WindowSize = new EasProperty('AirSync', 32); - $o->Sync->Collections->Collection->Options = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Options->FilterType = new EasProperty('AirSync', 0); - $o->Sync->Collections->Collection->Options->BodyPreference = new EasObject('AirSyncBase'); - $o->Sync->Collections->Collection->Options->BodyPreference->Type = new EasProperty('AirSyncBase', 1); - $o->Sync->Collections->Collection->Commands = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Commands->Modify = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Commands->Modify->EntityId = new EasProperty('AirSync', $eid); - $o->Sync->Collections->Collection->Commands->Modify->Data = $data; - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntitySync($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->Sync->Status) && $o->Sync->Status->getContents() != '1') { - throw new EasException($o->Sync->Status->getContents(), 'EU'); - } - // evaluate response status - elseif (isset($o->Sync->Collections->Collection) && $o->Sync->Collections->Collection->Status->getContents() != '1') { - throw new EasException($o->Sync->Collections->Collection->Status->getContents(), 'EU'); - } - else { - // return response message - return $o->Sync->Collections->Collection; - } - } - else { - // return blank response - return null; - } - - } - - /** - * delete item in remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $cid Collection Id - * @param string $cst Collection Signature Token - * @param string $eid Entity Id - * - * @return EasObject|null True on success / Null on failure - */ - public function deleteEntity(EasClient $DataStore, string $cid, string $cst, string $eid): EasObject | null { - - // construct Sync request - $o = new \stdClass(); - $o->Sync = new EasObject('AirSync'); - $o->Sync->Collections = new EasObject('AirSync'); - $o->Sync->Collections->Collection = new EasObject('AirSync'); - $o->Sync->Collections->Collection->SyncKey = new EasProperty('AirSync', $cst); - $o->Sync->Collections->Collection->CollectionId = new EasProperty('AirSync', $cid); - $o->Sync->Collections->Collection->DeletesAsMoves = new EasProperty('AirSync', 0); - $o->Sync->Collections->Collection->GetChanges = new EasProperty('AirSync', 0); - $o->Sync->Collections->Collection->WindowSize = new EasProperty('AirSync', 32); - $o->Sync->Collections->Collection->Options = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Options->FilterType = new EasProperty('AirSync', 0); - $o->Sync->Collections->Collection->Options->BodyPreference = new EasObject('AirSyncBase'); - $o->Sync->Collections->Collection->Options->BodyPreference->Type = new EasProperty('AirSyncBase', 1); - $o->Sync->Collections->Collection->Commands = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Commands->Delete = new EasObject('AirSync'); - $o->Sync->Collections->Collection->Commands->Delete->EntityId = new EasProperty('AirSync', $eid); - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntitySync($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->Sync->Status) && $o->Sync->Status->getContents() != '1') { - throw new EasException($o->Sync->Status->getContents(), 'ED'); - } - // evaluate response status - elseif (isset($o->Sync->Collections->Collection) && $o->Sync->Collections->Collection->Status->getContents() != '1') { - throw new EasException($o->Sync->Collections->Collection->Status->getContents(), 'ED'); - } - else { - // return response message - return $o->Sync->Collections->Collection; - } - } - else { - // return blank response - return null; - } - - } - - /** - * retrieve item attachment(s) from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * @param string $batch Attachement ID's (array) - * - * @return array Collection of EasObjects on success / Null on failure - */ - public function fetchAttachment(EasClient $DataStore, array $batch): ?array { - - // construct Entityoperation request - $o = new \stdClass(); - $o->EntityOperations = new EasObject('EntityOperations'); - $o->EntityOperations->Fetch = new EasCollection('EntityOperations'); - - foreach ($batch as $aid) { - // construct object - $a = new EasObject('EntityOperations'); - // assign properties - $a->Store = new EasProperty('EntityOperations', 'Mailbox'); - $a->FileReference = new EasProperty('AirSyncBase', $aid); - // add to collection - $o->EntityOperations->Fetch[] = $a; - } - - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performEntityOperation($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if (isset($o->EntityOperations->Status) && $o->EntityOperations->Status->getContents() != '1') { - throw new EasException($o->EntityOperations->Status->getContents(), 'EF'); - } - // evaluate response - if (!is_array($o->EntityOperations->Response->Fetch)) { - // return response message - return [$o->EntityOperations->Response->Fetch]; - } else { - // return response message - return $o->EntityOperations->Response->Fetch; - } - } - else { - // return blank response - return null; - } - - } - - /** - * create item attachment(s) from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore - Storage Interface - * @param array $batch - Collection of FileAttachmentType Objects - * - * @return object Attachement Collection Object on success / Null on failure - */ - public function createAttachment(EasClient $DataStore, string $iid, array $batch): array { - - return null; - - } - - /** - * delete item attachment(s) from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore - Storage Interface - * @param array $batch - Collection of String Attachemnt Id(s) - * - * @return object Attachement Collection Object on success / Null on failure - */ - public function deleteAttachment(EasClient $DataStore, array $batch): array { - - return null; - - } - - /** - * connect to event nofifications - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore - Storage Interface - * - * @return object Items Object on success / Null on failure - */ - public function connectEvents(EasClient $DataStore, int $duration, array $ids = null, array $dids = null, array $types = null): ?object { - - return null; - - } - - /** - * disconnect from event nofifications - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore - Storage Interface - * - * @return object Items Object on success / Null on failure - */ - public function disconnectEvents(EasClient $DataStore, string $id): ?bool { - - return null; - - } - - /** - * observe event nofifications - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore - Storage Interface - * - * @return object Items Object on success / Null on failure - */ - public function fetchEvents(EasClient $DataStore, string $id, string $token): ?object { - - return null; - - } - - /** - * retrieve settings from remote storage - * - * @since Release 1.0.0 - * - * @param EasClient $DataStore Storage Interface - * - * @return EasObject|null EasObject on success / Null on failure - */ - public function retrieveSettings(EasClient $DataStore, string $class): EasObject | null { - - // construct command - $o = new \stdClass(); - $o->Settings = new EasObject('Settings'); - $o->Settings->$class = new EasObject('Settings'); - $o->Settings->$class->Get = new EasObject('Settings', null); - // evaluate settings class - if ($class == 'Oof') { - $o->Settings->$class->Get->BodyType = new EasProperty('Settings', 'Text'); - } - // serialize request message - $rq = $this->_encoder->stringFromObject($o); - // execute request - $rs = $DataStore->performSettings($rq); - // evaluate, if data was returned - if (!empty($rs)) { - // deserialize response message - $o = $this->_decoder->stringToObject($rs); - // evaluate response status - if ($o->Settings->Status->getContents() != '1' && $o->Settings->Status->getContents() != '110') { - throw new EasException($o->Settings->Status->getContents(), 'ST'); - } - // return response object - return $o->Settings->$class->Get; - } - else { - // return blank response - return null; - } - - } } diff --git a/lib/Service/Remote/RemoteEventsService.php b/lib/Service/Remote/RemoteEventsService.php index 8d5600d..27dc2e9 100644 --- a/lib/Service/Remote/RemoteEventsService.php +++ b/lib/Service/Remote/RemoteEventsService.php @@ -908,19 +908,19 @@ public function fromTimeZone(string $zone): ?DateTimeZone { . 'a64dstname/vdstyear/vdstmonth/vdstday/vdstweek/vdsthour/vdstminute/vdstsecond/vdstmillis/ldstbias', $zone); // extract zone name from array and convert to UTF8 $name = trim(@iconv('UTF-16', 'UTF-8', $zone['stdname'])); - // convert EWS time zone name to DateTimeZone object + // convert JMAP time zone name to DateTimeZone object return \OCA\JMAPC\Utile\TimeZoneEAS::toDateTimeZone($name); } /** - * Converts DateTimeZone object to EWS (Microsoft/Windows) time zone name + * Converts DateTimeZone object to JMAP (Microsoft/Windows) time zone name * * @since Release 1.0.0 * * @param DateTimeZone $zone * - * @return string valid EWS time zone name on success, or null on failure + * @return string valid JMAP time zone name on success, or null on failure */ public function toTimeZone(DateTimeZone $zone, DateTime $date = null): string { diff --git a/lib/Tasks/EAS-Calendar-Create b/lib/Tasks/EAS-Calendar-Create deleted file mode 100644 index 1461928bc469ba6d061c3198b241f3e0067d2423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmb7C+iuh_5FN{XLgJx+us^Wc@g+_C(1)?(O`(l;(|Q+J0n$PP1*#&ErQ3`6cgCwC z6@-L1N@g<0W1mrcr1%W+_3T(KYrL7I_uICP+jiM;CVu^TrWUTPH_bdznG*M?mh0gV z#Hl<0@m3;;vm6$(P#VOGm$`ubIF$;-Q4T@?EStFu>&yP?eEki?iM&S&x~!BPql+}Q zMu&0bP>(TG!B}N%)bsiYm=@wOiz%(1cJ~ zJ@t`l$K@aRMYzJ6()og19UWQp#v-{YXgpA8Yrf&rM^hQY$M96J|9p4r$1+`f8bperformHarmonization($uid, 'S'); - - exit; - - // construct decoder - //$EasXmlEncoder = new \OCA\JMAPC\Utile\Eas\EasXmlEncoder(); - //$EasXmlDecoder = new \OCA\JMAPC\Utile\Eas\EasXmlDecoder(); - - // Load From File - //$stream = fopen(__DIR__ . '/EAS-Calendar-Create', 'r'); - // read data as stream - //$msg_ref_obj = $EasXmlDecoder->streamToObject($stream); - // read data as string - //$msg_ref_raw = stream_get_contents($stream); - //$msg_ref_obj = $EasXmlDecoder->stringToObject($msg_ref_raw); - //fclose($stream); - - //exit; - // construct remote data store client - $EasClient = $CoreService->createClient($uid); - - // assign remote data store to module - $RemoteEventsService->initialize($EasClient); - - // perform initial connect - $EasClient->performConnect(); - - $cid = 2; - $cst = 0; - - // retrieve collection delta - $rs = $RemoteEventsService->reconcileCollection($cid, $cst); - - if (isset($rs->SyncKey)) { - $cst = $rs->SyncKey->getContents(); - } - - // retrieve collection delta - $rs = $RemoteEventsService->reconcileCollection($cid, $cst); - - exit; - } catch (Exception $ex) { $logger->logException($ex, ['app' => 'integration_jmapc']); $logger->info('Test ended unexpectedly', ['app' => 'integration_jmapc']); diff --git a/lib/Utile/Eas/EasAuthenticationBasic.php b/lib/Utile/Eas/EasAuthenticationBasic.php deleted file mode 100644 index ae0e885..0000000 --- a/lib/Utile/Eas/EasAuthenticationBasic.php +++ /dev/null @@ -1,37 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasAuthenticationBasic -{ - public string $Id; - public string $Secret; - - public function __construct (string $id = '', string $secret = '') { - $this->Id = $id; - $this->Secret = $secret; - } -} diff --git a/lib/Utile/Eas/EasAuthenticationBearer.php b/lib/Utile/Eas/EasAuthenticationBearer.php deleted file mode 100644 index 6f1dc21..0000000 --- a/lib/Utile/Eas/EasAuthenticationBearer.php +++ /dev/null @@ -1,39 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasAuthenticationBearer -{ - public string $Id; - public string $Token; - public int $Expiry; - - public function __construct (string $id, string $token = '', int $expiry = 0) { - $this->Id = $id; - $this->Token = $token; - $this->Expiry = $expiry; - } -} diff --git a/lib/Utile/Eas/EasClient.php b/lib/Utile/Eas/EasClient.php deleted file mode 100644 index f735328..0000000 --- a/lib/Utile/Eas/EasClient.php +++ /dev/null @@ -1,633 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -/** - * Exchange Active Sync Client - */ -class EasClient -{ - /** - * Transport Version - * - * @var int - */ - const TRANSPORT_VERSION_1 = CURL_HTTP_VERSION_1_0; - const TRANSPORT_VERSION_1_1 = CURL_HTTP_VERSION_1_1; - const TRANSPORT_VERSION_2 = CURL_HTTP_VERSION_2_0; - /** - * Transport Mode - * - * @var string - */ - const TRANSPORT_MODE_STANDARD = 'http://'; - const TRANSPORT_MODE_SECURE = 'https://'; - /** - * Service Version - * - * @var integer - */ - const SERVICE_VERSION_161 = '16.1'; - const SERVICE_VERSION_160 = '16.0'; - const SERVICE_VERSION_141 = '14.1'; - const SERVICE_VERSION_140 = '14.0'; - const SERVICE_VERSION_121 = '12.1'; - const SERVICE_VERSION_120 = '12.0'; - /** - * Transport Mode - * - * @var string - */ - protected string $_TransportMode = self::TRANSPORT_MODE_SECURE; - /** - * Transpost Header - */ - protected array $_TransportHeader = [ - 'Connection' => 'Connection: Keep-Alive', - 'Content-Type' => 'Content-Type: application/vnd.ms-sync.wbxml', - 'MS-ASProtocolVersion' => 'MS-ASProtocolVersion: ' . self::SERVICE_VERSION_161, - 'X-MS-PolicyKey' => 'X-MS-PolicyKey: 0' - ]; - /** - * Transpost Options - */ - protected array $_TransportOptions = [ - CURLOPT_USERAGENT => 'NextCloudEAS/1.0 (1.0; x64)', - CURLOPT_HTTP_VERSION => self::TRANSPORT_VERSION_2, - CURLOPT_CONNECTTIMEOUT => 30, - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_HEADER => true, - CURLOPT_POST => true, - CURLOPT_CUSTOMREQUEST => null - ]; - /** - * Service Host - * - * @var string - */ - protected string $_ServiceHost = ''; - /** - * Service Path - * - * @var string - */ - protected string $_ServicePath = '/Microsoft-Server-ActiveSync'; - /** - * Services Uri base that we are going to connect to - * - * @var string - */ - protected string $_ServiceUriBase = ''; - /** - * Services uri qery that we are going to send to - * - * @var string - */ - protected string $_ServiceUriQuery = ''; - /** - * Authentication to use when connecting to the service - * - * @var EasAuthenticationBasic|EasAuthenticationBearer - */ - protected $_ServiceAuthentication; - /** - * Service Devide Type - * - * @var string - */ - protected string $_ServiceDeviceType = 'NextCloudEAS'; - /** - * Service Devide Id - * - * @var string - */ - protected string $_ServiceDeviceId = ''; - /** - * Service Devide Key - * - * @var string - */ - protected string $_ServiceDeviceKey = ''; - /** - * Services version that we are going to connect with - * - * @var string - */ - protected string $_ServiceVersion; - /** - * cURL resource used to make the request - * - * @var CurlHandle - */ - protected $_client; - - /** - * Constructor for the ExchangeWebServices class - * - * @param string $host EAS Service Provider (FQDN, IPv4, IPv6) - * @param string $authentication EAS Authentication - * @param string $version EAS Protocol Version - */ - public function __construct( - $host = '', - $authentication = null, - $id = '', - $key = '', - $version = self::SERVICE_VERSION_161 - ) { - - // set service host - $this->setHost($host); - // set service authentication - $this->setAuthentication($authentication); - // set service device id - $this->setDeviceId($id); - // set service device key - $this->setDeviceKey($key); - // set service version - $this->setVersion($version); - - } - - public function configureTransportVersion(int $value): void { - - // store parameter - $this->_TransportOptions[CURLOPT_HTTP_VERSION] = $value; - // destroy existing client will need to be initilized again - $this->_client = null; - - } - - public function configureTransportMode(string $value): void { - - // store parameter - $this->_TransportMode = $value; - // destroy existing client will need to be initilized again - $this->_client = null; - // reconstruct service location - $this->constructServiceUriBase(); - - } - - public function configureTransportOptions(array $options): void { - - // store parameter - $this->_TransportOptions = array_replace($this->_TransportOptions, $options); - // destroy existing client will need to be initilized again - $this->_client = null; - - } - - public function configureTransportVerification(bool $value): void { - - // store parameter - $this->_TransportOptions[CURLOPT_SSL_VERIFYPEER] = $value; - // destroy existing client will need to be initilized again - $this->_client = null; - - } - - protected function constructServiceUriBase(): void { - - // set service location - $this->_ServiceUriBase = $this->_TransportMode . $this->_ServiceHost . $this->_ServicePath; - - } - - protected function constructServiceUriQuery(): void { - - // set service location - $this->_ServiceUriQuery = '?DeviceType=' . $this->_ServiceDeviceType . - '&DeviceId=' . $this->_ServiceDeviceId . - '&User=' . $this->_ServiceAuthentication->Id; - - } - - public function setTransportAgent(string $value): void { - - // store transport agent parameter - $this->_TransportOptions[CURLOPT_USERAGENT] = $value; - // destroy existing client will need to be initilized again - $this->_client = null; - - } - - public function getTransportAgent(): string { - - // return transport agent paramater - return $this->_TransportOptions[CURLOPT_USERAGENT]; - - } - - /** - * Gets the service host parameter - * - * @return string - */ - public function getHost(): string { - - // return service host parameter - return $this->_ServiceHost; - - } - - /** - * Sets the service host parameter to be used for all requests - * - * @param string $value - */ - public function setHost(string $value): void { - - // store service host - $this->_ServiceHost = $value; - // destroy existing client will need to be initilized again - $this->_client = null; - // reconstruct service uri base - $this->constructServiceUriBase(); - - } - - /** - * Gets the service path parameter - * - * @return string - */ - public function getPath(): string { - - // return service path parameter - return $this->_ServicePath; - - } - - /** - * Sets the service path parameter to be used for all requests - * - * @param string $value - */ - public function setPath(string $value): void { - - // store service path parameter - $this->ServicePath = $value; - // destroy existing client will need to be initilized again - $this->_client = null; - // reconstruct service uri base - $this->constructServiceUriBase(); - - } - - /** - * Gets the protocol version parameter - * - * @return string - */ - public function getVersion(): string { - - // return version information - return $this->_ServiceVersion; - - } - - /** - * Sets the protocol version parameter to be used for all requests - * - * @param int $value - */ - public function setVersion(string $value): void { - - // store service version - $this->_ServiceVersion = $value; - // set version on client - $this->_TransportHeader['MS-ASProtocolVersion'] = 'MS-ASProtocolVersion: ' . $value; - - } - - /** - * Gets the service device id parameter - * - * @return string - */ - public function getDeviceId(): string { - - // return service device id parameter - return $this->_ServiceDeviceId; - - } - - /** - * Sets the service device policy key to be used for all requests - * - * @param string $value - */ - public function setDeviceId(string $value): void { - - // store service policy key parameter - $this->_ServiceDeviceId = $value; - // set key on client - $this->constructServiceUriQuery(); - - } - - /** - * Gets the service device policy key parameter - * - * @return string - */ - public function getDeviceKey(): string { - - // return service policy key parameter - return $this->_ServiceDeviceKey; - - } - - /** - * Sets the service device policy key to be used for all requests - * - * @param string $value - */ - public function setDeviceKey(string $value): void { - - // store service policy key parameter - $this->_ServiceDeviceKey = $value; - // set key on client - $this->_TransportHeader['X-MS-PolicyKey'] = 'X-MS-PolicyKey: ' . $value; - - } - - /** - * Gets the authentication parameters object - * - * @return AuthenticationBasic|AuthenticationBeare - */ - public function getAuthentication(): EasAuthenticationBasic|EasAuthenticationBearer { - - // return authentication information - return $this->_ServiceAuthentication; - - } - - /** - * Sets the authentication parameters to be used for all requests - * - * @param AuthenticationBasic|AuthenticationBearer $value - */ - public function setAuthentication(EasAuthenticationBasic|EasAuthenticationBearer $value): void { - - // store parameter - $this->_ServiceAuthentication = $value; - // destroy existing client will need to be initilized again - $this->_client = null; - // set service basic authentication - if ($this->_ServiceAuthentication instanceof EasAuthenticationBasic) { - $this->_TransportOptions[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC; - $this->_TransportOptions[CURLOPT_USERPWD] = $this->_ServiceAuthentication->Id . ':' . $this->_ServiceAuthentication->Secret; - } - // set service bearer authentication - if ($this->_ServiceAuthentication instanceof EasAuthenticationBearer) { - unset($this->_TransportOptions[CURLOPT_HTTPAUTH]); - $this->_TransportHeader['Authorization'] = 'Authorization: Bearer ' . $this->_ServiceAuthentication->Token; - } - // construct service query - $this->constructServiceUriQuery(); - - } - - public function performCommand($message): null|string { - // clear last headers and response - $this->_ResponseHeaders = ''; - $this->_ResponseData = ''; - - // evaluate if http client is initilized and location is the same - if (!isset($this->_client)) { - $this->_client = curl_init(); - } - - curl_setopt_array($this->_client, $this->_TransportOptions); - curl_setopt($this->_client, CURLOPT_HTTPHEADER, array_values($this->_TransportHeader)); - // set request data - if (!empty($message)) { - curl_setopt($this->_client, CURLOPT_POSTFIELDS, $message); - } - // execute request - $this->_ResponseData = curl_exec($this->_client); - - // evealuate execution errors - $code = curl_errno($this->_client); - if ($code > 0) { - throw new RuntimeException(curl_error($this->_client), $code); - } - - // evaluate http responses - $code = (int) curl_getinfo($this->_client, CURLINFO_RESPONSE_CODE); - if ($code > 400) { - switch ($code) { - case 401: - throw new RuntimeException('Unauthorized', $code); - break; - case 403: - throw new RuntimeException('Forbidden', $code); - break; - case 404: - throw new RuntimeException('Not Found', $code); - break; - case 408: - throw new RuntimeException('Request Timeout', $code); - break; - } - } - - // separate headers and body - $size = curl_getinfo($this->_client, CURLINFO_HEADER_SIZE); - $this->_ResponseHeaders = substr($this->_ResponseData, 0, $size); - $this->_ResponseData = substr($this->_ResponseData, $size); - // return body - return $this->_ResponseData; - } - - public function performConnect(): null|string { - - // configure client for command - unset($this->_TransportOptions[CURLOPT_POST]); - $this->_TransportOptions[CURLOPT_CUSTOMREQUEST] = 'OPTIONS'; - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase; - // perform command - $data = $this->performCommand(''); - // configure client to defualts - $this->_TransportOptions[CURLOPT_POST] = true; - unset($this->_TransportOptions[CURLOPT_CUSTOMREQUEST]); - // return response body - return $data; - - } - - public function performCollectionCreate($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=FolderCreate'; - return $this->performCommand($data); - - } - - public function performCollectionDelete($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=FolderDelete'; - return $this->performCommand($data); - - } - - public function performCollectionUpdate($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=FolderUpdate'; - return $this->performCommand($data); - - } - - public function performCollectionSync($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=FolderSync'; - return $this->performCommand($data); - - } - - // Performs same function as performCollectionSync but only valid for protocol versions 2.5, 12.0, and 12.1 - public function performCollectionHierarchy($data): null|string { - - throw new Exception("Command not implemented, use CollectionsSync instead."); - - } - - // Performs same function as performEntityOperation or performEntitySync but only valid for protocol versions 2.5, 12.0, and 12.1 - public function performEntityAttachment($data): null|string { - - throw new Exception("Command not implemented, use performEntityOperation or performEntitySync instead."); - - } - - public function performEntityEstimate($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=GetItemEstimate'; - return $this->performCommand($data); - - } - - // Performs same function as performEntitySearch and only valid only for protocol version 16.1 - public function performEntityFind($data): null|string { - - throw new Exception("Command not implemented, use performEntitySearch instead."); - - } - - public function performEntityOperation($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=ItemOperations'; - return $this->performCommand($data); - - } - - public function performEntitySearch($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=Search'; - return $this->performCommand($data); - - } - - public function performEntitySync($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=Sync'; - return $this->performCommand($data); - - } - - public function performMeetingResponse($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=MeetingResponse'; - return $this->performCommand($data); - - } - - public function performMoveItems($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=MoveItems'; - return $this->performCommand($data); - - } - - public function performPing($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=Ping'; - return $this->performCommand($data); - - } - - public function performProvision($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=Provision'; - return $this->performCommand($data); - - } - - public function performResolveRecipients($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=ResolveRecipients'; - return $this->performCommand($data); - - } - - public function performMailSend($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=SendMail'; - return $this->performCommand($data); - - } - - public function performMailForward($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=SmartForward'; - return $this->performCommand($data); - - } - - public function performMailReply($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=SmartReply'; - return $this->performCommand($data); - - } - - public function performSettings($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=Settings'; - return $this->performCommand($data); - - } - - public function performValidateCert($data): null|string { - - $this->_TransportOptions[CURLOPT_URL] = $this->_ServiceUriBase . $this->_ServiceUriQuery . '&Cmd=ValidateCert'; - return $this->performCommand($data); - - } - -} diff --git a/lib/Utile/Eas/EasCollection.php b/lib/Utile/Eas/EasCollection.php deleted file mode 100644 index 10e79e1..0000000 --- a/lib/Utile/Eas/EasCollection.php +++ /dev/null @@ -1,46 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasCollection extends \ArrayObject -{ - private ?string $_namespace = null; - - /*Constructor method with arguments*/ - public function __construct(string $namespace = null) - { - $this->_namespace = $namespace; - } - - public function getNamespace(): string { - return $this->_namespace; - } - - public function setNamespace(string $namespace): void { - $this->_namespace = $namespace; - } - -} \ No newline at end of file diff --git a/lib/Utile/Eas/EasException.php b/lib/Utile/Eas/EasException.php deleted file mode 100644 index 3846178..0000000 --- a/lib/Utile/Eas/EasException.php +++ /dev/null @@ -1,152 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -use Exception; -use Throwable; - -class EasException extends Exception { - - private static $_messages = [ - // Autodiscovery - 'AD-2' => 'Protocol error', - // Collection Create - 'CC-2' => 'The parent folder already contains a folder with the same name. Create the folder under a different name.', - 'CC-3' => 'The specified parent folder is a special system folder. Create the folder under a different parent.', - 'CC-5' => 'The parent folder does not exist on the server, possibly because it has been deleted or moved.', - 'CC-6' => 'An error occurred on the server.', - 'CC-9' => 'Synchronization key mismatch or invalid synchronization key.', - 'CC-10' => 'Malformed request. The request contains a semantic error, or attempted to create a default folder, such as the Inbox folder, Outbox folder, or Contacts folder.', - // Collection Update - 'CU-2' => 'A folder with that name already exists or the specified folder is a special folder.', - 'CU-3' => 'The specified folder is a special folder. Special folders cannot be updated.', - 'CU-4' => 'The specified folder does not exist.', - 'CU-5' => 'The specified parent folder does not exist.', - 'CU-6' => 'An error occurred on the server.', - 'CU-9' => 'Synchronization key mismatch or invalid synchronization key.', - 'CU-10' => 'Incorrectly formatted request.', - // Collection Delete - 'CD-3' => 'The specified folder is a special system folder and cannot be deleted.', - 'CD-4' => 'The specified folder does not exist.', - 'CD-6' => 'An error occurred on the server.', - 'CD-9' => 'Synchronization key mismatch or invalid synchronization key.', - // Collection Sync - 'CS-6' => 'An error occurred on the server.', - 'CS-9' => 'Synchronization key mismatch or invalid synchronization key.', - 'CS-10' => 'Incorrectly formatted request.', - // Entity Estimate - 'EE-2' => 'One or more of the specified folders does not exist or an incorrect folder was requested.', - 'EE-3' => 'The synchronization state has not been primed.', - 'EE-4' => 'The specified synchronization key was invalid. Malformed or mismatched synchronization key.', - // Entity Find - 'EF-2' => 'The request was invalid. The search failed to validate.', - 'EF-3' => 'FolderSync required. The folder hierarchy is out of date.', - 'EF-4' => 'The requested range does not begin with 0.', - // Entity Operation - 'EO-2' => 'Protocol error. Protocol violation/XML validation error.', - 'EO-3' => 'Server error.', - 'EO-4' => 'Document library. The specified URI is bad.', - 'EO-5' => 'Document library. Access denied.', - 'EO-6' => 'Document library. The object was not found or access denied.', - 'EO-7' => 'Document library. Failed to connect to the server.', - 'EO-8' => 'The byte-range is invalid or too large.', - 'EO-9' => 'The store is unknown or unsupported.', - 'EO-10' => 'The file is empty.', - 'EO-11' => 'The requested data size is too large.', - 'EO-12' => 'Failed to download file because of input/output (I/O) failure.', - 'EO-14' => 'Fetch. The item failed conversion.', - 'EO-15' => 'Fetch. Attachment or attachment ID is invalid.', - 'EO-16' => 'Access to the resource is denied.', - 'EO-17' => 'Partial success; a Fetch, Move, or EmptyFolderContents operation completed partially.', - 'EO-18' => 'Credentials required.', - // Entity Sync - 'ES-3' => 'Invalid or mismatched synchronization key.', - 'ES-4' => 'Protocol error. There was a semantic error in the request. The request that not comply with the specification requirements.', - 'ES-5' => 'Server error. Server misconfiguration, temporary system issue, or bad item. This is frequently a transient condition.', - 'ES-6' => 'Error in client/server conversion. A malformed or invalid item was sent', - 'ES-7' => 'Conflict matching the client and server object. The client has changed an item for which the conflict policy indicates that the server\'s changes take precedence.', - 'ES-8' => 'Object not found. The client issued a fetch or change operation that has a Collection Id or Entity Id value that is no longer valid on the server (for example, the item was deleted).', - 'ES-9' => 'The Sync command cannot be completed. User account could be out of disk space.', - 'ES-12' => 'The collection hierarchy has changed. Mailbox collections are not synchronized.', - 'ES-13' => 'The sync command request is not complete. An empty or partial sync command request was received and the cached set of notify-able collections is missing.', - 'ES-14' => 'Invalid Wait or HeartbeatInterval value.', - 'ES-15' => 'Invalid sync command request.', - 'ES-16' => 'Retry. Something on the server caused a retriable error.', - // Settings - 'ST-2' => 'Protocol error.', - 'ST-3' => 'Access denied.', - 'ST-4' => 'Server unavailable.', - 'ST-5' => 'Invalid arguments.', - 'ST-6' => 'Conflicting arguments.', - 'ST-7' => 'Denied by policy.', - // Global - 101 => 'Invalid Content. The body of the HTTP request sent by the client is invalid.', - 102 => 'Invalid WBXML. The request contains WBXML but it could not be decoded.', - 103 => 'Invalid XML. The XML provided in the request does not follow the protocol requirements.', - 104 => 'Invalid DateTime. The request contains a timestamp that could not be parsed into a valid date and time.', - 105 => 'Invalid Combination Of IDs. The request contains a combination of parameters that is invalid.', - 106 => 'Invalid IDs. The request contains one or more IDs that could not be parsed into valid values.', - 107 => 'Invalid MIME. The request contains MIME that could not be parsed.', - 108 => 'Device Id Missing Or Invalid. The device ID is either missing or has an invalid format.', - 109 => 'Device Type Missing Or Invalid. The device type is either missing or has an invalid format.', - 110 => 'Server Error. The server encountered an unknown error, the device SHOULD NOT retry later.', - 111 => 'Server Error Retry Later. The server encountered an unknown error, the device SHOULD retry later.', - 112 => 'Active Directory Access Denied. The server does not have access to read/write to an object in the directory service.', - 113 => 'Mailbox Quota Exceeded. The mailbox has reached its size quota.', - 114 => 'Mailbox Server Offline. The mailbox server is offline.', - 115 => 'Send Quota Exceeded. The request would exceed the send quota.', - 116 => 'Message Recipient Unresolved. One of the recipients could not be resolved to an email address.', - - ]; - - /** - * @param string|int $code [optional] The Exception code. - * @param string $message [optional] The Exception message to throw. - * @param null|Throwable $previous [optional] The previous throwable used for the exception chaining. - */ - public function __construct(string|int $code = 0, string $operation, string $message = null, Throwable $previous = null) { - if (!is_numeric($code)) { - $code = (int)$code; - } - if ($code < 100) { - $mcode = $operation . '-' . $code; - } - else { - $mcode = $code; - } - - if (!isset($message)) { - if (isset(self::$_messages[$mcode])) { - $message = $mcode . ': ' . self::$_messages[$mcode]; - } - else { - $message = $code . ': Unknown Error'; - } - - } - parent::__construct($message, $code, $previous); - } -} diff --git a/lib/Utile/Eas/EasLocator.php b/lib/Utile/Eas/EasLocator.php deleted file mode 100644 index 0da64b9..0000000 --- a/lib/Utile/Eas/EasLocator.php +++ /dev/null @@ -1,898 +0,0 @@ -. -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasLocator -{ - /** - * The path appended to the various schemes and hostnames used during - * autodiscovery. - * - * @var string - */ - const AUTODISCOVER_PATH = '/autodiscover/autodiscover.xml'; - - /** - * Server was discovered using the TLD method. - * - * @var integer - */ - const AUTODISCOVERED_VIA_TLD = 10; - - /** - * Server was discovered using the subdomain method. - * - * @var integer - */ - const AUTODISCOVERED_VIA_SUBDOMAIN = 11; - - /** - * Server was discovered using the unauthenticated GET method. - * - * @var integer - */ - const AUTODISCOVERED_VIA_UNAUTHENTICATED_GET = 12; - - /** - * Server was discovered using the DNS SRV redirect method. - * - * @var integer - */ - const AUTODISCOVERED_VIA_SRV_RECORD = 13; - - /** - * Server was discovered using the HTTP redirect method. - * - * @var integer - * - * @todo We do not currently support this. - */ - const AUTODISCOVERED_VIA_RESPONSE_REDIRECT = 14; - - /** - * The email address to attempt autodiscovery against. - * - * @var string - */ - protected $email; - - /** - * The password to present during autodiscovery. - * - * @var string - */ - protected $password; - - /** - * The Exchange username to use during authentication. If unspecified, - * the provided email address will be used as the username. - * - * @var string - */ - protected $username; - - /** - * The top-level domain name, extracted from the provided email address. - * - * @var string - */ - protected $tld; - - /** - * The Autodiscover XML request. Since it's used repeatedly, it's cached - * in this property to avoid redundant re-generation. - * - * @var string - */ - protected $requestxml; - - /** - * The Certificate Authority path. Should point to a directory containing - * one or more certificates to use in SSL verification. - * - * @var string - */ - protected $capath; - - /** - * The path to a specific Certificate Authority file. Get one and use it - * for full Autodiscovery compliance. - * - * @var string - * - * @link http://curl.haxx.se/ca/cacert.pem - * @link http://curl.haxx.se/ca/ - */ - protected $cainfo; - - /** - * Skip SSL verification. Bad idea, and violates the strict Autodiscover - * protocol. But, here in case you have no other option. - * Defaults to FALSE. - * - * @var boolean - */ - protected $skip_ssl_verification = false; - - /** - * The body of the last response. - * - * @var string - */ - public $last_response; - - /** - * An associative array of response headers that resulted from the - * last request. Keys are lowercased for easy checking. - * - * @var array - */ - public $last_response_headers; - - /** - * The output of curl_info() relating to the most recent cURL request. - * - * @var array - */ - public $last_info; - - /** - * The cURL error code associated with the most recent cURL request. - * - * @var integer - */ - public $last_curl_errno; - - /** - * Human-readable description of the most recent cURL error. - * - * @var string - */ - public $last_curl_error; - - /** - * The value in seconds to use for Autodiscover host connection timeouts. - * Default connection timeout is 2 seconds, so that unresponsive methods - * can be bypassed quickly. - * - * @var integer - */ - public $connection_timeout = 2; - - /** - * Information about an Autodiscover Response containing an error will - * be stored here. - * - * @var mixed - */ - public $error = false; - - /** - * Information about an Autodiscover Response with a redirect will be - * retained here. - * - * @var mixed - */ - public $redirect = false; - - /** - * A successful, non-error and non-redirect parsed Autodiscover response - * will be stored here. - * - * @var mixed - */ - public $discovered = null; - - /** - * Constructor for the EWSAutodiscover class. - * - * @param string $email - * @param string $password - * @param string $username - * If left blank, the email provided will be used. - */ - public function __construct($email, $password, $username = null) - { - $this->email = $email; - $this->password = $password; - - if ($username === null) { - $username = $email; - } - $this->username = $username; - - $this->setTLD(); - } - - /** - * Execute the full discovery chain of events in the correct sequence - * until a valid response is received, or all methods have failed. - * - * @return integer - * One of the AUTODISCOVERED_VIA_* constants. - * - * @throws \RuntimeException - * When all autodiscovery methods fail. - */ - public function locate() - { - $result = $this->tryTLD(); - - if ($result === false) { - $result = $this->trySubdomain(); - } - - if ($result === false) { - $result = $this->trySubdomainUnauthenticatedGet(); - } - - if ($result === false) { - $result = $this->trySRVRecord(); - } - - if ($result === false) { - throw new \RuntimeException('Autodiscovery failed.'); - } - - return $result; - } - - /** - * Return the settings discovered from the Autodiscover process. - * - * NULL indicates discovery has not completed (or been attempted) - * FALSE indicates discovery was not successful. Check for errors - * or redirects. - * An array will be returned with discovered settings on success. - * - * @return mixed - */ - public function discoveredSettings() - { - return $this->discovered; - } - - /** - * Toggle skipping of SSL verification in cURL requests. - * - * @param boolean $skip - * Whether or not to skip SSL certificate verification. - * @return self - * - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) - */ - public function skipSSLVerification($skip = true) - { - $this->skip_ssl_verification = (bool) $skip; - - return $this; - } - - /** - * Parse the hex ServerVersion value and return a valid - * EWSClient::VERSION_* constant. - * - * @return string|boolean A known version constant, or FALSE if it could not - * be determined. - * - * @link http://msdn.microsoft.com/en-us/library/bb204122(v=exchg.140).aspx - * @link http://blogs.msdn.com/b/pcreehan/archive/2009/09/21/parsing-serverversion-when-an-int-is-really-5-ints.aspx - * @link http://office.microsoft.com/en-us/outlook-help/determine-the-version-of-microsoft-exchange-server-my-account-connects-to-HA001191800.aspx - * - * @param string $version_hex - * Hexadecimal version string. - */ - public function parseServerVersion($version_hex) - { - $svbinary = base_convert($version_hex, 16, 2); - if (strlen($svbinary) == 31) { - $svbinary = '0' . $svbinary; - } - - $majorversion = (int) base_convert(substr($svbinary, 4, 6), 2, 10); - $minorversion = (int) base_convert(substr($svbinary, 10, 6), 2, 10); - $majorbuild = (int) base_convert(substr($svbinary, 17, 15), 2, 10); - - switch ($majorversion) { - case 8: - return $this->parseVersion2007($minorversion); - case 14: - return $this->parseVersion2010($minorversion); - case 15: - if ($minorversion == 0) { - return $this->parseVersion2013($majorbuild); - } - - return $this->parseVersion2016(); - } - - // Guess we didn't find a known version. - return false; - } - - /** - * Method to return a new EWSClient object, auto-configured - * with the proper hostname. - * - * @return mixed Client object on success, FALSE on failure. - */ - public function newEWS() - { - // Discovery not yet attempted. - if ($this->discovered === null) { - $this->discover(); - } - - // Discovery not successful. - if ($this->discovered === false) { - return false; - } - - $server = false; - $version = null; - - // Pick out the host from the EXPR (Exchange RPC over HTTP). - foreach ($this->discovered['Account']['Protocol'] as $protocol) { - if (($protocol['Type'] == 'EXCH' || $protocol['Type'] == 'EXPR') - && isset($protocol['ServerVersion'])) { - if ($version === null) { - $sv = $this->parseServerVersion($protocol['ServerVersion']); - if ($sv !== false) { - $version = $sv; - } - } - } - - if ($protocol['Type'] == 'EXPR' && isset($protocol['Server'])) { - $server = $protocol['Server']; - } - } - - if ($server) { - if ($version === null) { - // EWS class default. - $version = EWSClient::VERSION_2007; - } - return new EWSClient( - $server, - (!empty($this->username) ? $this->username : $this->email), - $this->password, - $version - ); - } - - return false; - } - - /** - * Static method may fail if there are issues surrounding SSL certificates. - * In such cases, set up the object as needed, and then call newEWS(). - * - * @param string $email - * @param string $password - * @param string $username - * If left blank, the email provided will be used. - * @return mixed - */ - public static function getEWS($email, $password, $username = null) - { - $auto = new Autodiscover($email, $password, $username); - return $auto->newEWS(); - } - - /** - * Perform an NTLM authenticated HTTPS POST to the top-level - * domain of the email address. - * - * @return integer|boolean - * One of the AUTODISCOVERED_VIA_* constants or false on failure. - */ - public function tryTLD() - { - $url = 'https://' . $this->tld . self::AUTODISCOVER_PATH; - return ($this->tryViaUrl($url) ? self::AUTODISCOVERED_VIA_TLD : false); - } - - /** - * Perform an NTLM authenticated HTTPS POST to the 'autodiscover' - * subdomain of the email address' TLD. - * - * @return integer|boolean - * One of the AUTODISCOVERED_VIA_* constants or false on failure. - */ - public function trySubdomain() - { - $url = 'https://autodiscover.' . $this->tld . self::AUTODISCOVER_PATH; - return ($this->tryViaUrl($url) - ? self::AUTODISCOVERED_VIA_SUBDOMAIN - : false); - } - - /** - * Perform an unauthenticated HTTP GET in an attempt to get redirected - * via 302 to the correct location to perform the HTTPS POST. - * - * @return integer|boolean - * One of the AUTODISCOVERED_VIA_* constants or false on failure. - */ - public function trySubdomainUnauthenticatedGet() - { - $this->reset(); - $url = 'http://autodiscover.' . $this->tld . self::AUTODISCOVER_PATH; - $ch = curl_init(); - $opts = array( - CURLOPT_URL => $url, - CURLOPT_HTTPGET => true, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 4, - CURLOPT_CONNECTTIMEOUT => $this->connection_timeout, - CURLOPT_FOLLOWLOCATION => false, - CURLOPT_HEADER => false, - CURLOPT_HEADERFUNCTION => array($this, 'readHeaders'), - CURLOPT_HTTP200ALIASES => array(301, 302), - CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 - ); - curl_setopt_array($ch, $opts); - $this->last_response = curl_exec($ch); - $this->last_info = curl_getinfo($ch); - $this->last_curl_errno = curl_errno($ch); - $this->last_curl_error = curl_error($ch); - - if ($this->last_info['http_code'] == 302 - || $this->last_info['http_code'] == 301) { - if ($this->tryViaUrl($this->last_response_headers['location'])) { - return self::AUTODISCOVERED_VIA_UNAUTHENTICATED_GET; - } - } - - return false; - } - - /** - * Attempt to retrieve the autodiscover host from an SRV DNS record. - * - * @link http://support.microsoft.com/kb/940881 - * - * @return integer|boolean - * The value of self::AUTODISCOVERED_VIA_SRV_RECORD or false. - */ - public function trySRVRecord() - { - $srvhost = '_autodiscover._tcp.' . $this->tld; - $lookup = dns_get_record($srvhost, DNS_SRV); - if (sizeof($lookup) > 0) { - $host = $lookup[0]['target']; - $url = 'https://' . $host . self::AUTODISCOVER_PATH; - if ($this->tryViaUrl($url)) { - return self::AUTODISCOVERED_VIA_SRV_RECORD; - } - } - - return false; - } - - /** - * Set the path to the file to be used by CURLOPT_CAINFO. - * - * @param string $path - * Path to a certificate file such as cacert.pem - * @return self - */ - public function setCAInfo($path) - { - if (file_exists($path) && is_file($path)) { - $this->cainfo = $path; - } - - return $this; - } - - /** - * Set the path to the file to be used by CURLOPT_CAPATH. - * - * @param string $path - * Path to a directory containing one or more CA certificates. - * @return self - */ - public function setCAPath($path) - { - if (is_dir($path)) { - $this->capath = $path; - } - - return $this; - } - - /** - * Set a connection timeout for the POST methods. - * - * @param integer $seconds - * Seconds to wait for a connection. - * @return self - */ - public function setConnectionTimeout($seconds) - { - $this->connection_timeout = intval($seconds); - - return $this; - } - - /** - * Perform the NTLM authenticated post against one of the chosen - * endpoints. - * - * @param string $url - * URL to try posting to. - * @param integer $timeout - * Number of seconds before the request should timeout. - * @return boolean - */ - public function doNTLMPost($url, $timeout = 6) - { - $this->reset(); - - $ch = curl_init(); - $opts = array( - CURLOPT_URL => $url, - CURLOPT_HTTPAUTH => CURLAUTH_BASIC | CURLAUTH_NTLM, - CURLOPT_CUSTOMREQUEST => 'POST', - CURLOPT_POSTFIELDS => $this->getAutoDiscoverRequest(), - CURLOPT_RETURNTRANSFER => true, - CURLOPT_USERPWD => $this->username . ':' . $this->password, - CURLOPT_TIMEOUT => $timeout, - CURLOPT_CONNECTTIMEOUT => $this->connection_timeout, - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_HEADER => false, - CURLOPT_HEADERFUNCTION => array($this, 'readHeaders'), - CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4, - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_SSL_VERIFYHOST => 2, - ); - - // Set the appropriate content-type. - curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=utf-8')); - - if (!empty($this->cainfo)) { - $opts[CURLOPT_CAINFO] = $this->cainfo; - } - - if (!empty($this->capath)) { - $opts[CURLOPT_CAPATH] = $this->capath; - } - - if ($this->skip_ssl_verification) { - $opts[CURLOPT_SSL_VERIFYPEER] = false; - } - - curl_setopt_array($ch, $opts); - $this->last_response = curl_exec($ch); - $this->last_info = curl_getinfo($ch); - $this->last_curl_errno = curl_errno($ch); - $this->last_curl_error = curl_error($ch); - - if ($this->last_curl_errno != CURLE_OK) { - return false; - } - - $discovered = $this->parseAutodiscoverResponse(); - - return $discovered; - } - - /** - * Parse the Autoresponse Payload, particularly to determine if an - * additional request is necessary. - * - * @return boolean|array FALSE if response isn't XML or parsed response - * array. - */ - protected function parseAutodiscoverResponse() - { - // Content-type isn't trustworthy, unfortunately. Shame on Microsoft. - if (substr($this->last_response, 0, 5) !== 'responseToArray($this->last_response); - - if (isset($response['Error'])) { - $this->error = $response['Error']; - return false; - } - - // Check the account action for redirect. - switch ($response['Account']['Action']) { - case 'redirectUrl': - $this->redirect = array( - 'redirectUrl' => $response['Account']['RedirectUrl'] - ); - return false; - case 'redirectAddr': - $this->redirect = array( - 'redirectAddr' => $response['Account']['RedirectAddr'] - ); - return false; - case 'settings': - default: - $this->discovered = $response; - return true; - } - } - - /** - * Set the top-level domain to be used with autodiscover attempts based - * on the provided email address. - * - * @return boolean - */ - protected function setTLD() - { - $pos = strpos($this->email, '@'); - if ($pos !== false) { - $this->tld = trim(substr($this->email, $pos + 1)); - return true; - } - - return false; - } - - /** - * Reset the response-related structures. Called before making a new - * request. - * - * @return self - */ - public function reset() - { - $this->last_response_headers = array(); - $this->last_info = array(); - $this->last_curl_errno = 0; - $this->last_curl_error = ''; - - return $this; - } - - /** - * Return the generated Autodiscover XML request body. - * - * @return string - * - * @suppress PhanTypeMismatchArgumentInternal - */ - public function getAutodiscoverRequest() - { - if (!empty($this->requestxml)) { - return $this->requestxml; - } - - $xml = new \XMLWriter(); - $xml->openMemory(); - $xml->setIndent(true); - $xml->startDocument('1.0', 'UTF-8'); - $xml->startElementNS( - null, - 'Autodiscover', - 'http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006' - ); - - $xml->startElement('Request'); - $xml->writeElement('EMailAddress', $this->email); - $xml->writeElement( - 'AcceptableResponseSchema', - 'http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a' - ); - $xml->endElement(); - $xml->endElement(); - - $this->requestxml = $xml->outputMemory(); - return $this->requestxml; - } - - /** - * Utility function to pick headers off of the incoming cURL response. - * Used with CURLOPT_HEADERFUNCTION. - * - * @param resource $_ch - * cURL handle. - * @param string $str - * Header string to read. - * @return integer - * Bytes read. - * - * @todo Determine if we can remove $_ch here. - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function readHeaders($_ch, $str) - { - $pos = strpos($str, ':'); - if ($pos !== false) { - $key = strtolower(substr($str, 0, $pos)); - $val = trim(substr($str, $pos + 1)); - $this->last_response_headers[$key] = $val; - } - - return strlen($str); - } - - /** - * Utility function to parse XML payloads from the response into easier - * to manage associative arrays. - * - * @param string $xml - * XML to parse. - * @return array - */ - public function responseToArray($xml) - { - $doc = new \DOMDocument(); - $doc->loadXML($xml); - $out = $this->nodeToArray($doc->documentElement); - - return $out['Response']; - } - - /** - * Recursive method for parsing DOM nodes. - * - * @param \DOMElement $node - * DOMNode object. - * @return mixed - * - * @link https://github.com/gaarf/XML-string-to-PHP-array - * - * @suppress PhanTypeMismatchArgument, PhanUndeclaredProperty - */ - protected function nodeToArray($node) - { - $output = array(); - switch ($node->nodeType) { - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - $output = trim($node->textContent); - break; - case XML_ELEMENT_NODE: - for ($i = 0, $m = $node->childNodes->length; $i < $m; $i++) { - $child = $node->childNodes->item($i); - $value = $this->nodeToArray($child); - if (isset($child->tagName)) { - $tag = $child->tagName; - if (!isset($output[$tag])) { - $output[$tag] = array(); - } - $output[$tag][] = $value; - } elseif ($value || $value === '0') { - $output = (string) $value; - } - } - - // Edge case of a node containing a text node, which also has - // attributes. this way we'll retain text and attributes for - // this node. - if (is_string($output) && $node->attributes->length) { - $output = array('@text' => $output); - } - - if (is_array($output)) { - if ($node->attributes->length) { - $attributes = array(); - foreach ($node->attributes as $attrName => $attrNode) { - $attributes[$attrName] = (string) $attrNode->value; - } - $output['@attributes'] = $attributes; - } - foreach ($output as $tag => $value) { - if (is_array($value) && count($value) == 1 && $tag != '@attributes') { - $output[$tag] = $value[0]; - } - } - } - break; - } - - return $output; - } - - /** - * Parses the version of an Exchange 2007 server. - * - * @param integer $minorversion - * Minor server version. - * @return string Server version. - */ - protected function parseVersion2007($minorversion) - { - switch ($minorversion) { - case 0: - return EWSClient::VERSION_2007; - case 1: - case 2: - case 3: - return EWSClient::VERSION_2007_SP1; - default: - return EWSClient::VERSION_2007; - } - } - - /** - * Parses the version of an Exchange 2010 server. - * - * @param integer $minorversion - * Minor server version. - * @return string Server version. - */ - protected function parseVersion2010($minorversion) - { - switch ($minorversion) { - case 0: - return EWSClient::VERSION_2010; - case 1: - return EWSClient::VERSION_2010_SP1; - case 2: - return EWSClient::VERSION_2010_SP2; - default: - return EWSClient::VERSION_2010; - } - } - - /** - * Parses the version of an Exchange 2013 server. - * - * @param integer $majorbuild - * Major build version. - * @return string Server version. - */ - protected function parseVersion2013($majorbuild) - { - return ($majorbuild == 847 - ? EWSClient::VERSION_2013_SP1 - : EWSClient::VERSION_2013); - } - - /** - * Parses the version of an Exchange 2016 server. - * - * @return string Server version. - */ - protected function parseVersion2016() - { - return EWSClient::VERSION_2016; - } - - /** - * Attempts an autodiscover via a URL. - * - * @param string $url - * Url to attempt an autodiscover. - * @param integer $timeout - * Number of seconds before the request should timeout. - * @return boolean - */ - protected function tryViaUrl($url, $timeout = 6) - { - $result = $this->doNTLMPost($url, $timeout); - return ($result ? true : false); - } -} diff --git a/lib/Utile/Eas/EasObject.php b/lib/Utile/Eas/EasObject.php deleted file mode 100644 index 396e05d..0000000 --- a/lib/Utile/Eas/EasObject.php +++ /dev/null @@ -1,46 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasObject -{ - private ?string $_namespace = null; - - /*Constructor method with arguments*/ - public function __construct(string $namespace = null) - { - $this->_namespace = $namespace; - } - - public function getNamespace(): string { - return $this->_namespace; - } - - public function setNamespace(string $namespace): void { - $this->_namespace = $namespace; - } - -} \ No newline at end of file diff --git a/lib/Utile/Eas/EasProperty.php b/lib/Utile/Eas/EasProperty.php deleted file mode 100644 index 3f51c94..0000000 --- a/lib/Utile/Eas/EasProperty.php +++ /dev/null @@ -1,70 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasProperty -{ - private ?string $_namespace = null; - private mixed $_contents = null; - private bool $_opaque = false; - - /*Constructor method with arguments*/ - public function __construct(string $namespace, mixed $content, bool $opaque = false) - { - $this->_namespace = $namespace; - $this->_contents = $content; - $this->_opaque = $opaque; - } - - public function getNamespace(): string { - return $this->_namespace; - } - - public function setNamespace(string $namespace): void { - $this->_namespace = $namespace; - } - - public function getContents(): mixed { - return $this->_contents; - } - - public function setContents(mixed $content): void { - $this->_contents = $content; - } - - public function hasContents(): bool { - return isset($this->_contents); - } - - public function getOpaque(): bool { - return $this->_opaque; - } - - public function setOpaque(bool $opaque): void { - $this->_opaque = $opaque; - } - -} \ No newline at end of file diff --git a/lib/Utile/Eas/EasTypes.php b/lib/Utile/Eas/EasTypes.php deleted file mode 100644 index 500ee0f..0000000 --- a/lib/Utile/Eas/EasTypes.php +++ /dev/null @@ -1,63 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasTypes { - - const COLLECTION_TYPE_SYSTEM_INBOX = 2; - const COLLECTION_TYPE_SYSTEM_DRAFTS = 3; - const COLLECTION_TYPE_SYSTEM_DELETED = 4; - const COLLECTION_TYPE_SYSTEM_SENT = 5; - const COLLECTION_TYPE_SYSTEM_OUTBOX = 6; - const COLLECTION_TYPE_SYSTEM_TASKS = 7; - const COLLECTION_TYPE_SYSTEM_CALENDAR = 8; - const COLLECTION_TYPE_SYSTEM_CONTACTS = 9; - const COLLECTION_TYPE_SYSTEM_NOTES = 10; - const COLLECTION_TYPE_SYSTEM_JOURNAL = 11; - const COLLECTION_TYPE_SYSTEM_CACHE = 19; - const COLLECTION_TYPE_USER_GENERIC = 1; - const COLLECTION_TYPE_USER_MAIL = 12; - const COLLECTION_TYPE_USER_CALENDAR = 13; - const COLLECTION_TYPE_USER_CONTACTS = 14; - const COLLECTION_TYPE_USER_TASKS = 15; - const COLLECTION_TYPE_USER_JOURNAL = 16; - const COLLECTION_TYPE_USER_NOTES = 17; - const COLLECTION_TYPE_USER_UNKNOWN = 19; - - const ENTITY_TYPE_MAIL = 'Email'; - const ENTITY_TYPE_CALENDAR = 'Calendar'; - const ENTITY_TYPE_CONTACT = 'Contacts'; - const ENTITY_TYPE_JOURNAL = 'Journal'; - const ENTITY_TYPE_TASK = 'Tasks'; - const ENTITY_TYPE_SMS = 'SMS'; - const ENTITY_TYPE_NOTE = 'Notes'; - - const BODY_TYPE_TEXT = 1; - const BODY_TYPE_HTML = 2; - const BODY_TYPE_RTF = 3; - const BODY_TYPE_MIME = 4; - -} \ No newline at end of file diff --git a/lib/Utile/Eas/EasXml.php b/lib/Utile/Eas/EasXml.php deleted file mode 100644 index 4f3a184..0000000 --- a/lib/Utile/Eas/EasXml.php +++ /dev/null @@ -1,62 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -class EasXml { - - // Implemented tokens by MS-ASWBXML - public const VERSION_V10 = 0x00; - public const VERSION_V11 = 0x01; - public const VERSION_V12 = 0x02; - public const VERSION_V13 = 0x03; - public const IDENTIFIER = 0x01; // Only public unknown identifier supported by MS-ASWBXML - public const ENCODING = 0x6A; // Only UTF-8 is supported by MS-ASWBXML - public const CODESPACE = 0x00; - public const NODE_CONTENTS = 0x40; - public const NODE_ATTRIBUTES = 0x80; - public const NODE_END = 0x01; - public const STRING_INLINE = 0x03; - public const STRING_COMPLETION = 0x00; - public const DATA = 0xC3; - // Unimplemented tokens by MS-ASWBXML - public const ENTITY = 0x02; - public const LITERAL = 0x04; - public const EXT_I_0 = 0x40; - public const EXT_I_1 = 0x41; - public const EXT_I_2 = 0x42; - public const PI = 0x43; - public const LITERAL_C = 0x44; - public const EXT_T_0 = 0x80; - public const EXT_T_1 = 0x81; - public const EXT_T_2 = 0x82; - public const STR_T = 0x83; - public const LITERAL_A = 0x84; - public const EXT_0 = 0xC0; - public const EXT_1 = 0xc1; - public const EXT_2 = 0xC2; - public const LITERAL_AC = 0xC4; - -} \ No newline at end of file diff --git a/lib/Utile/Eas/EasXmlDecoder.php b/lib/Utile/Eas/EasXmlDecoder.php deleted file mode 100644 index 21cb884..0000000 --- a/lib/Utile/Eas/EasXmlDecoder.php +++ /dev/null @@ -1,1097 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -use OCA\JMAPC\Utile\Eas\EasXml; - -class EasXmlDecoder{ - - //https://learn.microsoft.com/en-us/previous-versions/office/developer/exchange-server-interoperability-guidance/hh361570(v=exchg.140) - - /** - * TODO: Add decode to xml - */ - - /** - * namespace definitions from wbxml codes - * - * @var array - */ - private static $_namespaces = [ - 0x00 => 'AirSync', - 0x01 => 'Contacts', - 0x02 => 'Email', - 0x04 => 'Calendar', - 0x05 => 'Move', - 0x06 => 'EntityEstimate', - 0x07 => 'FolderHierarchy', - 0x08 => 'MeetingResponse', - 0x09 => 'Tasks', - 0x0A => 'ResolveRecipients', - 0x0B => 'ValidateCert', - 0x0C => 'Contacts2', - 0x0D => 'Ping', - 0x0E => 'Provision', - 0x0F => 'Search', - 0x10 => 'Gal', - 0x11 => 'AirSyncBase', - 0x12 => 'Settings', - 0x13 => 'DocumentLibrary', - 0x14 => 'EntityOperations', - 0x15 => 'ComposeMail', - 0x16 => 'Email2', - 0x17 => 'Notes', - 0x18 => 'RightsManagement', - 0x19 => 'Find', - 0xFE => 'WindowsLive' - ]; - - /** - * property definitions from wbxml codes - * - * @var array - */ - private static $_codes = [ - // #0 AirSync - 0x00 => [ - 0x05 => 'Sync', - 0x06 => 'Responses', - 0x07 => 'Add', - 0x08 => 'Modify', - 0x09 => 'Delete', - 0x0A => 'Fetch', - 0x0B => 'SyncKey', - 0x0C => 'ClientId', - 0x0D => 'EntityId', - 0x0E => 'Status', - 0x0F => 'Collection', - 0x10 => 'Class', - 0x12 => 'CollectionId', - 0x13 => 'GetChanges', - 0x14 => 'MoreAvailable', - 0x15 => 'WindowSize', - 0x16 => 'Commands', - 0x17 => 'Options', - 0x18 => 'FilterType', - 0x19 => 'Truncation', - 0x1B => 'Conflict', - 0x1C => 'Collections', - 0x1D => 'Data', - 0x1E => 'DeletesAsMoves', - 0x20 => 'Supported', - 0x21 => 'SoftDelete', - 0x22 => 'MIMESupport', - 0x23 => 'MIMETruncation', - 0x24 => 'Wait', - 0x25 => 'Limit', - 0x26 => 'Partial', - // EAS 14.0 - 0x27 => 'ConversationMode', - 0x28 => 'MaxEntitys', - 0x29 => 'HeartbeatInterval', - ], - // #1 Contacts - 0x01 => [ - 0x05 => 'Anniversary', - 0x06 => 'AssistantName', - 0x07 => 'AssistnamePhoneNumber', - 0x08 => 'Birthday', - 0x09 => 'Body', - 0x0A => 'BodySize', - 0x0B => 'BodyTruncated', - 0x0C => 'Business2PhoneNumber', - 0x0D => 'BusinessAddressCity', - 0x0E => 'BusinessAddressCountry', - 0x0F => 'BusinessAddressPostalCode', - 0x10 => 'BusinessAddressState', - 0x11 => 'BusinessAddressStreet', - 0x12 => 'BusinessFaxNumber', - 0x13 => 'BusinessPhoneNumber', - 0x14 => 'CarPhoneNumber', - 0x15 => 'Categories', - 0x16 => 'Category', - 0x17 => 'Children', - 0x18 => 'Child', - 0x19 => 'CompanyName', - 0x1A => 'Department', - 0x1B => 'Email1Address', - 0x1C => 'Email2Address', - 0x1D => 'Email3Address', - 0x1E => 'FileAs', - 0x1F => 'FirstName', - 0x20 => 'Home2PhoneNumber', - 0x21 => 'HomeAddressCity', - 0x22 => 'HomeAddressCountry', - 0x23 => 'HomeAddressPostalCode', - 0x24 => 'HomeAddressState', - 0x25 => 'HomeAddressStreet', - 0x26 => 'HomeFaxNumber', - 0x27 => 'HomePhoneNumber', - 0x28 => 'JobTitle', - 0x29 => 'LastName', - 0x2A => 'MiddleName', - 0x2B => 'MobilePhoneNumber', - 0x2C => 'OfficeLocation', - 0x2D => 'OtherAddressCity', - 0x2E => 'OtherAddressCountry', - 0x2F => 'OtherAddressPostalCode', - 0x30 => 'OtherAddressState', - 0x31 => 'OtherAddressStreet', - 0x32 => 'PagerNumber', - 0x33 => 'RadioPhoneNumber', - 0x34 => 'Spouse', - 0x35 => 'Suffix', - 0x36 => 'Title', - 0x37 => 'WebPage', - 0x38 => 'YomiCompanyName', - 0x39 => 'YomiFirstName', - 0x3A => 'YomiLastName', - 0x3B => 'Rtf', // EAS 2.5 only. - 0x3C => 'Picture', - // EAS 14.0 - 0x3D => 'Alias', - 0x3E => 'WeightedRank', - ], - // #2 Email - 0x02 => [ - 0x05 => 'Attachment', - 0x06 => 'Attachments', - 0x07 => 'AttName', - 0x08 => 'AttSize', - 0x09 => 'AttOid', - 0x0A => 'AttMethod', - 0x0B => 'AttRemoved', - 0x0C => 'Body', - 0x0D => 'BodySize', - 0x0E => 'BodyTruncated', - 0x0F => 'DateReceived', - 0x10 => 'DisplayName', - 0x11 => 'DisplayTo', - 0x12 => 'Importance', - 0x13 => 'MessageClass', - 0x14 => 'Subject', - 0x15 => 'Read', - 0x16 => 'To', - 0x17 => 'Cc', - 0x18 => 'From', - 0x19 => 'Reply-To', - 0x1A => 'AllDayEvent', - 0x1B => 'Categories', // EAS 14.0 - 0x1C => 'Category', // EAS 14.0 - 0x1D => 'DtStamp', - 0x1E => 'EndTime', - 0x1F => 'InstanceType', - 0x20 => 'BusyStatus', - 0x21 => 'Location', - 0x22 => 'MeetingRequest', - 0x23 => 'Organizer', - 0x24 => 'RecurrenceId', - 0x25 => 'Reminder', - 0x26 => 'ResponseRequested', - 0x27 => 'Recurrences', - 0x28 => 'Recurrence', - 0x29 => 'Type', - 0x2A => 'Until', - 0x2B => 'Occurrences', - 0x2C => 'Interval', - 0x2D => 'DayOfWeek', - 0x2E => 'DayOfMonth', - 0x2F => 'WeekOfMonth', - 0x30 => 'MonthOfYear', - 0x31 => 'StartTime', - 0x32 => 'Sensitivity', - 0x33 => 'Timezone', - 0x34 => 'GlobalObjId', - 0x35 => 'ThreadTopic', - 0x36 => 'MIMEData', - 0x37 => 'MIMETruncated', - 0x38 => 'MIMESize', - 0x39 => 'InternetCPID', - // EAS 12.0 - 0x3A => 'Flag', - 0x3B => 'FlagStatus', - 0x3C => 'ContentClass', - 0x3D => 'FlagType', - 0x3E => 'CompleteTime', - // EAS 14.0 - 0x3F => 'DisallowNewTimeProposal', - ], - // #3 AirNotify is deprecated - // #4 Calendar - 0x04 => [ - 0x05 => 'Timezone', - 0x06 => 'AllDayEvent', - 0x07 => 'Attendees', - 0x08 => 'Attendee', - 0x09 => 'Email', - 0x0A => 'Name', - 0x0B => 'Body', // 2.5 Only - 0x0C => 'BodyTruncated', // 2.5 Only - 0x0D => 'BusyStatus', - 0x0E => 'Categories', - 0x0F => 'Category', - 0x10 => 'Rtf', // 2.5 ONly - 0x11 => 'DtStamp', - 0x12 => 'EndTime', - 0x13 => 'Exception', - 0x14 => 'Exceptions', - 0x15 => 'Deleted', - 0x16 => 'ExceptionStartTime', - 0x17 => 'Location', - 0x18 => 'MeetingStatus', - 0x19 => 'OrganizerEmail', - 0x1A => 'OrganizerName', - 0x1B => 'Recurrence', - 0x1C => 'Type', - 0x1D => 'Until', - 0x1E => 'Occurrences', - 0x1F => 'Interval', - 0x20 => 'DayOfWeek', - 0x21 => 'DayOfMonth', - 0x22 => 'WeekOfMonth', - 0x23 => 'MonthOfYear', - 0x24 => 'Reminder', - 0x25 => 'Sensitivity', - 0x26 => 'Subject', - 0x27 => 'StartTime', - 0x28 => 'UID', - // EAS 12.0 - 0x29 => 'AttendeeStatus', - 0x2A => 'AttendeeType', - // EAS 12.1 (Apparently no longer documented). - 0x2B => 'Attachment', - 0x2C => 'Attachments', - 0x2D => 'AttName', - 0x2E => 'AttSize', - 0x2F => 'AttOid', - 0x30 => 'AttMethod', - 0x31 => 'AttRemoved', - 0x32 => 'DisplayName', - // EAS 14 - 0x33 => 'DisallowNewTimeProposal', - 0x34 => 'ResponseRequested', - 0x35 => 'AppointmentReplyTime', - 0x36 => 'ResponseType', - 0x37 => 'CalendarType', - 0x38 => 'IsLeapMonth', - // EAS 14.1 - 0x39 => 'FirstDayOfWeek', - 0x3A => 'OnlineMeetingConfLink', - 0x3B => 'OnlineMeetingExternalLink', - // EAS 16.0 - 0x3C => 'ClientUid', - ], - // #5 Move - 0x05 => [ - 0x05 => 'Moves', - 0x06 => 'Move', - 0x07 => 'SrcMsgId', - 0x08 => 'SrcFldId', - 0x09 => 'DstFldId', - 0x0A => 'Response', - 0x0B => 'Status', - 0x0C => 'DstMsgId', - ], - // #6 EntityEstimate - 0x06 => [ - 0x05 => 'EntityEstimate', - 0x06 => 'Version', // 12.1 - 0x07 => 'Collections', - 0x08 => 'Collection', - 0x09 => 'CollectionType', // 12.1 - 0x0A => 'CollectionId', - 0x0B => 'DateTime', // 12.1 - 0x0C => 'Estimate', - 0x0D => 'Response', - 0x0E => 'Status', - ], - // #7 FolderHierarchy - 0x07 => [ - 0x05 => 'Collections', - 0x06 => 'Collection', - 0x07 => 'Name', - 0x08 => 'Id', - 0x09 => 'ParentId', - 0x0A => 'Type', - 0x0B => 'Response', - 0x0C => 'Status', - 0x0D => 'ContentClass', - 0x0E => 'Changes', - 0x0F => 'Add', - 0x10 => 'Remove', - 0x11 => 'Update', - 0x12 => 'SyncKey', - 0x13 => 'CollectionCreate', - 0x14 => 'CollectionDelete', - 0x15 => 'CollectionUpdate', - 0x16 => 'CollectionSync', - 0x17 => 'Count', - 0x18 => 'Version', - ], - // #8 MeetingResponse - 0x08 => [ - 0x05 => 'CalendarId', - 0x06 => 'CollectionId', - 0x07 => 'MeetingResponse', - 0x08 => 'RequestId', - 0x09 => 'Request', - 0x0A => 'Result', - 0x0B => 'Status', - 0x0C => 'UserResponse', - 0x0D => 'Version', - // EAS 14.1 - 0x0E => 'InstanceId', - // EAS 16.0 - 0x12 => 'SendResponse', - ], - // #9 Tasks - 0x09 => [ - 0x05 => 'Body', - 0x06 => 'BodySize', - 0x07 => 'BodyTruncated', - 0x08 => 'Categories', - 0x09 => 'Category', - 0x0A => 'Complete', - 0x0B => 'DateCompleted', - 0x0C => 'DueDate', - 0x0D => 'UtcDueDate', - 0x0E => 'Importance', - 0x0F => 'Recurrence', - 0x10 => 'Type', - 0x11 => 'Start', - 0x12 => 'Until', - 0x13 => 'Occurrences', - 0x14 => 'Interval', - 0x16 => 'DayOfWeek', - 0x15 => 'DayOfMonth', - 0x17 => 'WeekOfMonth', - 0x18 => 'MonthOfYear', - 0x19 => 'Regenerate', - 0x1A => 'DeadOccur', - 0x1B => 'ReminderSet', - 0x1C => 'ReminderTime', - 0x1D => 'Sensitivity', - 0x1E => 'StartDate', - 0x1F => 'UtcStartDate', - 0x20 => 'Subject', - 0x21 => 'Rtf', - // EAS 12.0 - 0x22 => 'OrdinalDate', - 0x23 => 'SubOrdinalDate', - // EAS 14.0 - 0x24 => 'CalendarType', - 0x25 => 'IsLeapMonth', - // EAS 14.1 - 0x26 => 'FirstDayOfWeek', - ], - // 10 ResolveRecipients - 0x0A => [ - 0x05 => 'ResolveRecipients', - 0x06 => 'Response', - 0x07 => 'Status', - 0x08 => 'Type', - 0x09 => 'Recipient', - 0x0A => 'DisplayName', - 0x0B => 'EmailAddress', - 0x0C => 'Certificates', - 0x0D => 'Certificate', - 0x0E => 'MiniCertificate', - 0x0F => 'Options', - 0x10 => 'To', - 0x11 => 'CertificateRetrieval', - 0x12 => 'RecipientCount', - 0x13 => 'MaxCertificates', - 0x14 => 'MaxAmbiguousRecipients', - 0x15 => 'CertificateCount', - 0x16 => 'Availability', - 0x17 => 'StartTime', - 0x18 => 'EndTime', - 0x19 => 'MergedFreeBusy', - // 14.1 - 0x1A => 'Picture', - 0x1B => 'MaxSize', - 0x1C => 'Data', - 0x1D => 'MaxPictures', - ], - // #11 ValidateCert - 0x0B => [ - 0x05 => 'ValidateCert', - 0x06 => 'Certificates', - 0x07 => 'Certificate', - 0x08 => 'CertificateChain', - 0x09 => 'CheckCRL', - 0x0A => 'Status', - ], - // #12 Contacts2 - 0x0C => [ - 0x05 => 'CustomerId', - 0x06 => 'GovernmentId', - 0x07 => 'IMAddress', - 0x08 => 'IMAddress2', - 0x09 => 'IMAddress3', - 0x0A => 'ManagerName', - 0x0B => 'CompanyMainPhone', - 0x0C => 'AccountName', - 0x0D => 'NickName', - 0x0E => 'MMS', - ], - // #13 Ping - 0x0D => [ - 0x05 => 'Ping', - 0x06 => 'AutdState', - 0x07 => 'Status', - 0x08 => 'HeartbeatInterval', - 0x09 => 'Collections', - 0x0A => 'Collection', - 0x0B => 'ServerEntryId', - 0x0C => 'CollectionType', - 0x0D => 'MaxCollections', - ], - // #14 Provision - 0x0E => [ - 0x05 => 'Provision', - 0x06 => 'Policies', - 0x07 => 'Policy', - 0x08 => 'PolicyType', - 0x09 => 'PolicyKey', - 0x0A => 'Data', - 0x0B => 'Status', - 0x0C => 'RemoteWipe', - 0x0D => 'EASProvisionDoc', - // EAS 12.0 - 0x0E => 'DevicePasswordEnabled', - 0x0F => 'AlphanumericDevicePasswordRequired', - 0x10 => 'DeviceEncryptionEnabled', - 0x11 => 'PasswordRecoveryEnabled', - 0x12 => 'DocumentBrowseEnabled', - 0x13 => 'AttachmentsEnabled', - 0x14 => 'MinDevicePasswordLength', - 0x15 => 'MaxInactivityTimeDeviceLock', - 0x16 => 'MaxDevicePasswordFailedAttempts', - 0x17 => 'MaxAttachmentSize', - 0x18 => 'AllowSimpleDevicePassword', - 0x19 => 'DevicePasswordExpiration', - 0x1A => 'DevicePasswordHistory', - // EAS 12.1 - 0x1B => 'AllowStorageCard', - 0x1C => 'AllowCamera', - 0x1D => 'RequireDeviceEncryption', - 0x1E => 'AllowUnsignedApplications', - 0x1F => 'AllowUnsignedInstallationPackages', - 0x20 => 'MinDevicePasswordComplexCharacters', - 0x21 => 'AllowWiFi', - 0x22 => 'AllowTextMessaging', - 0x23 => 'AllowPOPIMAPEmail', - 0x24 => 'AllowBluetooth', - 0x25 => 'AllowIrDA', - 0x26 => 'RequireManualSyncWhenRoaming', - 0x27 => 'AllowDesktopSync', - 0x28 => 'MaxCalendarAgeFilter', - 0x29 => 'AllowHTMLEmail', - 0x2A => 'MaxEmailAgeFilter', - 0x2B => 'MaxEmailBodyTruncationSize', - 0x2C => 'MaxHTMLBodyTruncationSize', - 0x2D => 'RequireSignedSMIMEMessages', - 0x2E => 'RequireEncryptedSMIMEMessages', - 0x2F => 'RequireSignedSMIMEAlgorithm', - 0x30 => 'RequireEncryptedSMIMEAlgorithm', - 0x31 => 'AllowSMIMEEncryptionAlgorithmNegotiation', - 0x32 => 'AllowSMIMESoftCerts', - 0x33 => 'AllowBrowser', - 0x34 => 'AllowConsumerEmail', - 0x35 => 'AllowRemoteDesktop', - 0x36 => 'AllowInternetSharing', - 0x37 => 'UnapprovedInROMApplicationList', - 0x38 => 'ApplicationName', - 0x39 => 'ApprovedApplicationList', - 0x3A => 'Hash', - ], - // #15 Search - 0x0F => [ - 0x05 => 'Search', - 0x07 => 'Store', - 0x08 => 'Name', - 0x09 => 'Query', - 0x0A => 'Options', - 0x0B => 'Range', - 0x0C => 'Status', - 0x0D => 'Response', - 0x0E => 'Result', - 0x0F => 'Properties', - 0x10 => 'Total', - 0x11 => 'EqualTo', - 0x12 => 'Value', - 0x13 => 'And', - 0x14 => 'Or', - 0x15 => 'FreeText', - 0x17 => 'DeepTraversal', - 0x18 => 'LongId', - 0x19 => 'RebuildResults', - 0x1A => 'LessThan', - 0x1B => 'GreaterThan', - 0x1C => 'Schema', - 0x1D => 'Supported', - // EAS 12.1 - 0x1E => 'UserName', - 0x1F => 'Password', - 0x20 => 'ConversationId', - // EAS 14.1 - 0x21 => 'Picture', - 0x22 => 'MaxSize', - 0x23 => 'MaxPictures', - ], - // #16 GAL (Global Address List) - 0x10 => [ - 0x05 => 'DisplayName', - 0x06 => 'Phone', - 0x07 => 'Office', - 0x08 => 'Title', - 0x09 => 'Company', - 0x0A => 'Alias', - 0x0B => 'FirstName', - 0x0C => 'LastName', - 0x0D => 'HomePhone', - 0x0E => 'MobilePhone', - 0x0F => 'EmailAddress', - // 14.1 - 0x10 => 'Picture', - 0x11 => 'Status', - 0x12 => 'Data', - ], - // #17 AirSyncBase (12.0) - 0x11 => [ - 0x05 => 'BodyPreference', - 0x06 => 'Type', - 0x07 => 'TruncationSize', - 0x08 => 'AllOrNone', - 0x0A => 'Body', - 0x0B => 'Data', - 0x0C => 'EstimatedDataSize', - 0x0D => 'Truncated', - 0x0E => 'Attachments', - 0x0F => 'Attachment', - 0x10 => 'DisplayName', - 0x11 => 'FileReference', - 0x12 => 'Method', - 0x13 => 'ContentId', - 0x14 => 'ContentLocation', - 0x15 => 'IsInline', - 0x16 => 'NativeBodyType', - 0x17 => 'ContentType', - // EAS 14.0 - 0x18 => 'Preview', - // EAS 14.1 - 0x19 => 'BodyPartPreference', - 0x1A => 'BodyPart', - 0x1B => 'Status', - // EAS 16.0 - 0x1C => 'Add', - 0x1D => 'Delete', - 0x1E => 'ClientId', - 0x1F => 'Content', - 0x20 => 'Location', - 0x21 => 'Annontation', - 0x22 => 'Street', - 0x23 => 'City', - 0x24 => 'State', - 0x25 => 'Country', - 0x26 => 'PostalCode', - 0x27 => 'Latitude', - 0x28 => 'Longitude', - 0x29 => 'Accuracy', - 0x2A => 'Altitude', - 0x2B => 'AltitudeAccuracy', - 0x2C => 'LocationUri', - 0x2D => 'InstanceId', - ], - // #18 Settings - 0x12 => [ - 0x05 => 'Settings', - 0x06 => 'Status', - 0x07 => 'Get', - 0x08 => 'Set', - 0x09 => 'Oof', - 0x0A => 'OofState', - 0x0B => 'StartTime', - 0x0C => 'EndTime', - 0x0D => 'OofMessage', - 0x0E => 'AppliesToInternal', - 0x0F => 'AppliesToExternalKnown', - 0x10 => 'AppliesToExternalUnknown', - 0x11 => 'Enabled', - 0x12 => 'ReplyMessage', - 0x13 => 'BodyType', - 0x14 => 'DevicePassword', - 0x15 => 'Password', - 0x16 => 'Device', - 0x17 => 'Model', - 0x18 => 'IMEI', - 0x19 => 'FriendlyName', - 0x1A => 'OS', - 0x1B => 'OSLanguage', - 0x1C => 'PhoneNumber', - 0x1D => 'User', - 0x1E => 'EmailAddresses', - 0x1F => 'SmtpAddress', - // EAS 12.1 - 0x20 => 'UserAgent', - // EAS 14.0 - 0x21 => 'EnableOutboundSMS', - 0x22 => 'MobileOperator', - // EAS 14.1 - 0x23 => 'PrimarySmtpAddress', - 0x24 => 'Accounts', - 0x25 => 'Account', - 0x26 => 'AccountId', - 0x27 => 'AccountName', - 0x28 => 'UserDisplayName', - 0x29 => 'SendDisabled', - 0x2B => 'RightsManagementInformation', - ], - // #19 DocumentLibrary - 0x13 => [ - 0x05 => 'LinkId', - 0x06 => 'DisplayName', - 0x07 => 'IsCollection', - 0x08 => 'CreationDate', - 0x09 => 'LastModifiedDate', - 0x0A => 'IsHidden', - 0x0B => 'ContentLength', - 0x0C => 'ContentType' - ], - // #20 EntityOperations - 0x14 => [ - 0x05 => 'EntityOperations', - 0x06 => 'Fetch', - 0x07 => 'Store', - 0x08 => 'Options', - 0x09 => 'Range', - 0x0A => 'Total', - 0x0B => 'Properties', - 0x0C => 'Data', - 0x0D => 'Status', - 0x0E => 'Response', - 0x0F => 'Version', - 0x10 => 'Schema', - 0x11 => 'Part', - 0x12 => 'EmptyCollectionContent', - 0x13 => 'DeleteSubCollections', - // EAS 12.1 - 0x14 => 'UserName', - 0x15 => 'Password', - // EAS 14.0 - 0x16 => 'Move', - 0x17 => 'DstFldId', - 0x18 => 'ConversationId', - 0x19 => 'MoveAlways', - ], - // #21 ComposeMail (14.0) - 0x15 => [ - 0x05 => 'SendMail', - 0x06 => 'SmartForward', - 0x07 => 'SmartReply', - 0x08 => 'SaveInSentEntitys', - 0x09 => 'ReplaceMime', - 0x0A => 'Type', - 0x0B => 'Source', - 0x0C => 'CollectionId', - 0x0D => 'EntityId', - 0x0E => 'LongId', - 0x0F => 'InstanceId', - 0x10 => 'MIME', - 0x11 => 'ClientId', - 0x12 => 'Status', - // 14.1 - 0x13 => 'AccountId', - // EAS 16.0 - 0x15 => 'Forwardees', - 0x16 => 'Forwardee', - 0x17 => 'ForwardeeName', - 0x18 => 'ForwardeeEmail' - ], - // #22 Email2 (14.0) - 0x16 => [ - 0x05 => 'UmCallerId', - 0x06 => 'UmUserNotes', - 0x07 => 'UmAttDuration', - 0x08 => 'UmAttOrder', - 0x09 => 'ConversationId', - 0x0A => 'ConversationIndex', - 0x0B => 'LastVerbExecuted', - 0x0C => 'LastVerbExecutionTime', - 0x0D => 'ReceivedAsBcc', - 0x0E => 'Sender', - 0x0F => 'CalendarType', - 0x10 => 'IsLeapMonth', - // 14.1 - 0x11 => 'AccountId', - 0x12 => 'FirstDayOfWeek', - 0x13 => 'MeetingMessageType', - // EAS 16.0 - 0x15 => 'IsDraft', - 0x16 => 'Bcc', - 0x17 => 'Send' - ], - // #23 Notes (14.0) - 0x17 => [ - 0x05 => 'Subject', - 0x06 => 'MessageClass', - 0x07 => 'LastModifiedDate', - 0x08 => 'Categories', - 0x09 => 'Category', - ], - // #24 RightsManagement (14.1) - 0x18 => [ - 0x05 => 'RightsManagementSupport', - 0x06 => 'RightsManagementTemplates', - 0x07 => 'RightsManagementTemplate', - 0x08 => 'RightsManagementLicense', - 0x09 => 'EditAllowed', - 0x0A => 'ReplyAllowed', - 0x0B => 'ReplyAllAllowed', - 0x0C => 'ForwardAllowed', - 0x0D => 'ModifyRecipientsAllowed', - 0x0E => 'ExtractAllowed', - 0x0F => 'PrintAllowed', - 0x10 => 'ExportAllowed', - 0x11 => 'ProgrammaticAccessAllowed', - 0x12 => 'Owner', - 0x13 => 'ContentExpiryDate', - 0x14 => 'TemplateID', - 0x15 => 'TemplateName', - 0x16 => 'TemplateDescription', - 0x17 => 'ContentOwner', - 0x18 => 'RemoveRightsManagementDistribution' - ], - // #25 Find - 0x19 => [ - 0x05 => 'Find', - 0x06 => 'SearchId', - 0x07 => 'Search', - 0x08 => 'Criterion', - 0x09 => 'Query', - 0x0A => 'Status', - 0x0B => 'FreeText', - 0x0C => 'Options', - 0x0D => 'Range', - 0x0E => 'DeepTraversal', - 0x11 => 'Response', - 0x12 => 'Result', - 0x13 => 'Properties', - 0x14 => 'Preview', - 0x15 => 'HasAttachments' - ], - // #254 Windows Live - 0xFE => [ - 0x05 => 'Annotations', - 0x06 => 'Annotation', - 0x07 => 'Name', - 0x08 => 'Value' - ] - ]; - - /** - * WBXMLDecoder constructor. - */ - public function __construct() { - - } - - /** - * convert string data to object - * - * @param $input - * - * @throws Throwable - */ - public function stringToObject($data): object{ - - // construct stream object - $stream = fopen('php://temp', 'rw'); - try { - // write data to stream - fwrite($stream, $data); - // rewind stream to start - rewind($stream); - // process data - return $this->streamToObject($stream); - // close stream - fclose($stream); - } catch (\Throwable $e) { - // close stream - fclose($stream); - // throw error - throw $e; - } - - } - - /** - * convert stream data to object - * - * @param $stream data stream - * - * @throws Exception - */ - public function streamToObject($stream): object{ - - // construct base object - $o = new \stdClass(); - // version - $version = $this->_readByte($stream); - // evaluate, version - if($version !== EasXml::VERSION_V10 && $version !== EasXml::VERSION_V11 && $version !== EasXml::VERSION_V12 && $version !== EasXml::VERSION_V13){ - throw new \UnexpectedValueException("WBXML version 0x$version not supported"); - } - // idenitifier - $identifier = $this->_readMBUInt($stream); - // evaluate, public identifier - if ($identifier != EasXml::IDENTIFIER) { - throw new \UnexpectedValueException("WBXML public idenitifier 0x$identifier not supported"); - } - // encoding - $encoding = $this->_readMBUInt($stream); - // evaluate, character encoding - if ($encoding != EasXml::ENCODING) { - throw new \UnexpectedValueException("WBXML character encoding 0x$encoding not supported"); - } - // evaluate, strings table size - if ($this->_readMBUInt($stream) > 0) { - throw new \UnexpectedValueException("WBXML strings tables not supported"); - } - - // construct message property - $o = $this->_readBodyToObject($stream, 0); - - return $o; - - } - - /** - * read body from stream and convert to object - * - * @return string The single byte. - */ - protected function _readBodyToObject($stream, $page): mixed { - // construct object place holder - $node = new EasObject(self::$_namespaces[$page]); - - while(!feof($stream)) { - - $byte = $this->_readByte($stream); - - switch($byte) { - case EasXml::CODESPACE: - $page = $this->_readByte($stream); - if ($page < 0 || $page > 25) - { - throw new \UnexpectedValueException("Unknown code page ID 0x$page encountered in WBXML."); - } - break; - case EasXml::NODE_END: - $token = 'END'; - break 2; - case EasXml::STRING_INLINE: - $node = $this->_readString($stream); - $type = 'S'; - break; - case EasXml::DATA: - $node = $this->_readData($stream); - $type = 'O'; - break; - // According to MS-ASWBXML, these features are not used - case EasXml::ENTITY: - case EasXml::EXT_0: - case EasXml::EXT_1: - case EasXml::EXT_2: - case EasXml::EXT_I_0: - case EasXml::EXT_I_1: - case EasXml::EXT_I_2: - case EasXml::EXT_T_0: - case EasXml::EXT_T_1: - case EasXml::EXT_T_2: - case EasXml::LITERAL: - case EasXml::LITERAL_A: - case EasXml::LITERAL_AC: - case EasXml::LITERAL_C: - case EasXml::PI: - case EasXml::STR_T: - throw new \UnexpectedValueException("Unknown global token 0x$byte."); - // If it's not a global token, it should be a tag - default: - $hasAttributes = false; - $hasContents = false; - - $hasAttributes = ($byte & EasXml::NODE_ATTRIBUTES) > 0; - $hasContents = ($byte & EasXml::NODE_CONTENTS) > 0; - - $code = ($byte & 0x3F); - - // evalute, if token has attributes - if ($hasAttributes) { - throw new \UnexpectedValueException("Token 0x$code has attributes."); - } - - // evaluate, if namespace is valid - if (isset(self::$_namespaces[$page])) { - $namespace = self::$_namespaces[$page]; - } - else { - throw new \UnexpectedValueException("Namespace 0x$page is not valid."); - } - // evaluate, if token is valid - if (isset(self::$_codes[$page][$code])) { - $token = self::$_codes[$page][$code]; - } - else { - $token = "UNKNOWN_TAG_$token"; - } - //$node->setNamespace($namespace); - - if ($hasContents) { - // read next object - $o = $this->_readBodyToObject($stream, $page); - // evaluate if object or property already exisits and is not an array - if (isset($node->{$token}) && !is_array($node->{$token})) { - // convert tag object or property to array - $node->{$token} = [clone $node->{$token}]; - } - elseif (!isset($node->{$token})) { - // construct object or property place holder from tag - $node->{$token} = null; - } - - if (is_array($node->{$token})) { - // add object as property - if ($o instanceof EasObject) { - $node->{$token}[] = $o; - } else { - $node->{$token}[] = new EasProperty($namespace, $o); - } - } else { - // add object as property - if ($o instanceof EasObject) { - $node->{$token} = $o; - } else { - $node->{$token} = new EasProperty($namespace, $o); - } - } - } - break; - } - } - - return $node; - - } - - /** - * read a single byte from the stream. - * - * @return string The single byte. - */ - protected function _readByte($stream): mixed { - $byte = fread($stream,1); - if (strlen($byte) > 0) { - return ord($byte); - } else { - return null; - } - } - - /** - * read a MBU integer from the stream - * - * @return integer - */ - protected function _readMBUInt($stream): mixed { - $uint = 0; - while (1) { - $byte = $this->_readByte($stream); - $uint |= $byte & 0x7f; - if ($byte & 0x80) { - $uint = $uint << 7; - } else { - break; - } - } - return $uint; - } - - /** - * read a null terminated string from the stream - * - * @return string The string - */ - protected function _readString($stream): ?string { - $contents = ''; - while(1) { - $in = $this->_readByte($stream); - if ($in == 0) { - break; - } else { - $contents .= chr($in); - } - } - return $contents; - } - - /** - * read an opaque value from the stream - * - * @return string A string of bytes representing the opaque value. - */ - protected function _readData($stream): ?string { - // See http://php.net/fread for why we can't simply use a single fread() - // here. Bottom line, for buffered network streams it is possible - // that fread will only return a portion of the stream if chunk - // is smaller then $size, so we use a loop to reach $size. - - // read string size - $size = $this->_readMBUInt($stream); - $contents = ''; - while (1) { - $length = (($size - strlen($contents)) > 8192) ? 8192 : ($size - strlen($contents)); - if ($length > 0) { - $chunk = fread($stream, $length); - // evaluate if read failed or stream ended - if ($chunk === false || feof($stream)) { - throw new \Exception(sprintf( - 'Stream unavailable while trying to read %d bytes from stream. Aborting after %d bytes read.', - $size, - strlen($contents))); - } else { - $contents .= $chunk; - } - } - if (strlen($contents) >= $size) { - break; - } - } - return $contents; - } - -} \ No newline at end of file diff --git a/lib/Utile/Eas/EasXmlEncoder.php b/lib/Utile/Eas/EasXmlEncoder.php deleted file mode 100644 index 494ffc5..0000000 --- a/lib/Utile/Eas/EasXmlEncoder.php +++ /dev/null @@ -1,1053 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile\Eas; - -use OCA\JMAPC\Utile\Eas\EasXml; - -class EasXmlEncoder{ - - //https://learn.microsoft.com/en-us/previous-versions/office/developer/exchange-server-interoperability-guidance/hh361570(v=exchg.140) - - /** - * TODO: Add encode from xml - */ - - /** - * namespace definitions to wbxml codes - * - * @var array - */ - private static $_namespaces = [ - 'AirSync' => 0x00, - 'Contacts' => 0x01, - 'Email' => 0x02, - 'Calendar' => 0x04, - 'Move' => 0x05, - 'EntityEstimate' => 0x06, - 'CollectionHierarchy' => 0x07, - 'MeetingResponse' => 0x08, - 'Tasks' => 0x09, - 'ResolveRecipients' => 0x0A, - 'ValidateCert' => 0x0B, - 'Contacts2' => 0x0C, - 'Ping' => 0x0D, - 'Provision' => 0x0E, - 'Search' => 0x0F, - 'Gal' => 0x10, - 'AirSyncBase' => 0x11, - 'Settings' => 0x12, - 'DocumentLibrary' => 0x13, - 'EntityOperations' => 0x14, - 'ComposeMail' => 0x15, - 'Email2' => 0x16, - 'Notes' => 0x17, - 'RightsManagement' => 0x18, - 'Find' => 0x19, - 'WindowsLive' => 0xFE - ]; - - /** - * property definitions to wbxml codes - * - * @var array - */ - public static $_codes = [ - // #0 AirSync - 0x00 => [ - 'Sync' => 0x05, - 'Responses' => 0x06, - 'Add' => 0x07, - 'Modify' => 0x08, - 'Delete' => 0x09, - 'Fetch' => 0x0A, - 'SyncKey' => 0x0B, - 'ClientId' => 0x0C, - 'EntityId' => 0x0D, - 'Status' => 0x0E, - 'Collection' => 0x0F, - 'Class' => 0x10, - 'CollectionId' => 0x12, - 'GetChanges' => 0x13, - 'MoreAvailable' => 0x14, - 'WindowSize' => 0x15, - 'Commands' => 0x16, - 'Options' => 0x17, - 'FilterType' => 0x18, - 'Truncation' => 0x19, - 'Conflict' => 0x1B, - 'Collections' => 0x1C, - 'Data' => 0x1D, - 'DeletesAsMoves' => 0x1E, - 'Supported' => 0x20, - 'SoftDelete' => 0x21, - 'MIMESupport' => 0x22, - 'MIMETruncation' => 0x23, - 'Wait' => 0x24, - 'Limit' => 0x25, - 'Partial' => 0x26, - // EAS 14.0 - 'ConversationMode' => 0x27, - 'MaxEntitys' => 0x28, - 'HeartbeatInterval' => 0x29, - ], - // #1 Contacts - 0x01 => [ - 'Anniversary' => 0x05, - 'AssistantName' => 0x06, - 'AssistnamePhoneNumber' => 0x07, - 'Birthday' => 0x08, - 'Body' => 0x09, - 'BodySize' => 0x0A, - 'BodyTruncated' => 0x0B, - 'Business2PhoneNumber' => 0x0C, - 'BusinessAddressCity' => 0x0D, - 'BusinessAddressCountry' => 0x0E, - 'BusinessAddressPostalCode' => 0x0F, - 'BusinessAddressState' => 0x10, - 'BusinessAddressStreet' => 0x11, - 'BusinessFaxNumber' => 0x12, - 'BusinessPhoneNumber' => 0x13, - 'CarPhoneNumber' => 0x14, - 'Categories' => 0x15, - 'Category' => 0x16, - 'Children' => 0x17, - 'Child' => 0x18, - 'CompanyName' => 0x19, - 'Department' => 0x1A, - 'Email1Address' => 0x1B, - 'Email2Address' => 0x1C, - 'Email3Address' => 0x1D, - 'FileAs' => 0x1E, - 'FirstName' => 0x1F, - 'Home2PhoneNumber' => 0x20, - 'HomeAddressCity' => 0x21, - 'HomeAddressCountry' => 0x22, - 'HomeAddressPostalCode' => 0x23, - 'HomeAddressState' => 0x24, - 'HomeAddressStreet' => 0x25, - 'HomeFaxNumber' => 0x26, - 'HomePhoneNumber' => 0x27, - 'JobTitle' => 0x28, - 'LastName' => 0x29, - 'MiddleName' => 0x2A, - 'MobilePhoneNumber' => 0x2B, - 'OfficeLocation' => 0x2C, - 'OtherAddressCity' => 0x2D, - 'OtherAddressCountry' => 0x2E, - 'OtherAddressPostalCode' => 0x2F, - 'OtherAddressState' => 0x30, - 'OtherAddressStreet' => 0x31, - 'PagerNumber' => 0x32, - 'RadioPhoneNumber' => 0x33, - 'Spouse' => 0x34, - 'Suffix' => 0x35, - 'Title' => 0x36, - 'WebPage' => 0x37, - 'YomiCompanyName' => 0x38, - 'YomiFirstName' => 0x39, - 'YomiLastName' => 0x3A, - 'Rtf' => 0x3B, // EAS 2.5 only. - 'Picture' => 0x3C, - // EAS 14.0 - 'Alias' => 0x3D, - 'WeightedRank' => 0x3E - ], - // #2 Email - 0x02 => [ - 'Attachment' => 0x05, - 'Attachments' => 0x06, - 'AttName' => 0x07, - 'AttSize' => 0x08, - 'AttOid' => 0x09, - 'AttMethod' => 0x0A, - 'AttRemoved' => 0x0B, - 'Body' => 0x0C, - 'BodySize' => 0x0D, - 'BodyTruncated' => 0x0E, - 'DateReceived' => 0x0F, - 'DisplayName' => 0x10, - 'DisplayTo' => 0x11, - 'Importance' => 0x12, - 'MessageClass' => 0x13, - 'Subject' => 0x14, - 'Read' => 0x15, - 'To' => 0x16, - 'Cc' => 0x17, - 'From' => 0x18, - 'Reply-To' => 0x19, - 'AllDayEvent' => 0x1A, - 'Categories' => 0x1B, // EAS 14.0 - 'Category' => 0x1C, // EAS 14.0 - 'DtStamp' => 0x1D, - 'EndTime' => 0x1E, - 'InstanceType' => 0x1F, - 'BusyStatus' => 0x20, - 'Location' => 0x21, - 'MeetingRequest' => 0x22, - 'Organizer' => 0x23, - 'RecurrenceId' => 0x24, - 'Reminder' => 0x25, - 'ResponseRequested' => 0x26, - 'Recurrences' => 0x27, - 'Recurrence' => 0x28, - 'Type' => 0x29, - 'Until' => 0x2A, - 'Occurrences' => 0x2B, - 'Interval' => 0x2C, - 'DayOfWeek' => 0x2D, - 'DayOfMonth' => 0x2E, - 'WeekOfMonth' => 0x2F, - 'MonthOfYear' => 0x30, - 'StartTime' => 0x31, - 'Sensitivity' => 0x32, - 'Timezone' => 0x33, - 'GlobalObjId' => 0x34, - 'ThreadTopic' => 0x35, - 'MIMEData' => 0x36, - 'MIMETruncated' => 0x37, - 'MIMESize' => 0x38, - 'InternetCPID' => 0x39, - // EAS 12.0 - 'Flag' => 0x3A, - 'FlagStatus' => 0x3B, - 'ContentClass' => 0x3C, - 'FlagType' => 0x3D, - 'CompleteTime' => 0x3E, - // EAS 14.0 - 'DisallowNewTimeProposal' => 0xF - ], - // #3 AirNotify is deprecated - // #4 Calendar - 0x04 => [ - 'Timezone' => 0x05, - 'AllDayEvent' => 0x06, - 'Attendees' => 0x07, - 'Attendee' => 0x08, - 'Email' => 0x09, - 'Name' => 0x0A, - 'Body' => 0x0B, // 2.5 Only - 'BodyTruncated' => 0x0C, // 2.5 Only - 'BusyStatus' => 0x0D, - 'Categories' => 0x0E, - 'Category' => 0x0F, - 'Rtf' => 0x10, // 2.5 ONly - 'DtStamp' => 0x11, - 'EndTime' => 0x12, - 'Exception' => 0x13, - 'Exceptions' => 0x14, - 'Deleted' => 0x15, - 'ExceptionStartTime' => 0x16, - 'Location' => 0x17, - 'MeetingStatus' => 0x18, - 'OrganizerEmail' => 0x19, - 'OrganizerName' => 0x1A, - 'Recurrence' => 0x1B, - 'Type' => 0x1C, - 'Until' => 0x1D, - 'Occurrences' => 0x1E, - 'Interval' => 0x1F, - 'DayOfWeek' => 0x20, - 'DayOfMonth' => 0x21, - 'WeekOfMonth' => 0x22, - 'MonthOfYear' => 0x23, - 'Reminder' => 0x24, - 'Sensitivity' => 0x25, - 'Subject' => 0x26, - 'StartTime' => 0x27, - 'UID' => 0x28, - // EAS 12.0 - 'AttendeeStatus' => 0x29, - 'AttendeeType' => 0x2A, - // EAS 12.1 (Apparently no longer documented). - 'Attachment' => 0x2B, - 'Attachments' => 0x2C, - 'AttName' => 0x2D, - 'AttSize' => 0x2E, - 'AttOid' => 0x2F, - 'AttMethod' => 0x30, - 'AttRemoved' => 0x31, - 'DisplayName' => 0x32, - // EAS 14 - 'DisallowNewTimeProposal' => 0x33, - 'ResponseRequested' => 0x34, - 'AppointmentReplyTime' => 0x35, - 'ResponseType' => 0x36, - 'CalendarType' => 0x37, - 'IsLeapMonth' => 0x38, - // EAS 14.1 - 'FirstDayOfWeek' => 0x39, - 'OnlineMeetingConfLink' => 0x3A, - 'OnlineMeetingExternalLink' => 0x3B, - // EAS 16.0 - 'ClientUid' => 0x3C - ], - // #5 Move - 0x05 => [ - 'Moves' => 0x05, - 'Move' => 0x06, - 'SrcMsgId' => 0x07, - 'SrcFldId' => 0x08, - 'DstFldId' => 0x09, - 'Response' => 0x0A, - 'Status' => 0x0B, - 'DstMsgId' => 0x0C, - ], - // #6 EntityEstimate - 0x06 => [ - 'EntityEstimate' => 0x05, - 'Version' => 0x06, // 12.1 - 'Collections' => 0x07, - 'Collection' => 0x08, - 'CollectionClass' => 0x09, // 12.1 - 'CollectionId' => 0x0A, - 'DateTime' => 0x0B, // 12.1 - 'Estimate' => 0x0C, - 'Response' => 0x0D, - 'Status' => 0x0E, - ], - // #7 CollectionHierarchy - 0x07 => [ - 'Collections' => 0x05, - 'Collection' => 0x06, - 'Name' => 0x07, - 'Id' => 0x08, - 'ParentId' => 0x09, - 'Type' => 0x0A, - 'Response' => 0x0B, - 'Status' => 0x0C, - 'ContentClass' => 0x0D, - 'Changes' => 0x0E, - 'Add' => 0x0F, - 'Remove' => 0x10, - 'Update' => 0x11, - 'SyncKey' => 0x12, - 'CollectionCreate' => 0x13, - 'CollectionDelete' => 0x14, - 'CollectionUpdate' => 0x15, - 'CollectionSync' => 0x16, - 'Count' => 0x17, - 'Version' => 0x18 - ], - // #8 MeetingResponse - 0x08 => [ - 'CalendarId' => 0x05, - 'CollectionId' => 0x06, - 'MeetingResponse' => 0x07, - 'RequestId' => 0x08, - 'Request' => 0x09, - 'Result' => 0x0A, - 'Status' => 0x0B, - 'UserResponse' => 0x0C, - 'Version' => 0x0D, - 'InstanceId' => 0x0E, //EAS 14.1 - 'ProposedStartTime' => 0x10, // EAS 16.1 - 'ProposedEndTime' => 0x11, // EAS 16.1 - 'SendResponse' => 0x12, // EAS 16.0 - ], - // #9 Tasks - 0x09 => [ - 'Body' => 0x05, - 'BodySize' => 0x06, - 'BodyTruncated' => 0x07, - 'Categories' => 0x08, - 'Category' => 0x09, - 'Complete' => 0x0A, - 'DateCompleted' => 0x0B, - 'DueDate' => 0x0C, - 'UtcDueDate' => 0x0D, - 'Importance' => 0x0E, - 'Recurrence' => 0x0F, - 'Type' => 0x10, - 'Start' => 0x11, - 'Until' => 0x12, - 'Occurrences' => 0x13, - 'Interval' => 0x14, - 'DayOfMonth' => 0x15, - 'DayOfWeek' => 0x16, - 'WeekOfMonth' => 0x17, - 'MonthOfYear' => 0x18, - 'Regenerate' => 0x19, - 'DeadOccur' => 0x1A, - 'ReminderSet' => 0x1B, - 'ReminderTime' => 0x1C, - 'Sensitivity' => 0x1D, - 'StartDate' => 0x1E, - 'UtcStartDate' => 0x1F, - 'Subject' => 0x20, - 'Rtf' => 0x21, - 'OrdinalDate' => 0x22, // EAS 12.0 - 'SubOrdinalDate' => 0x23, // EAS 12.0 - 'CalendarType' => 0x24, // EAS 14.0 - 'IsLeapMonth' => 0x25, // EAS 14.0 - 'FirstDayOfWeek' => 0x26 // EAS 14.1 - ], - // 10 ResolveRecipients - 0x0A => [ - 'ResolveRecipients' => 0x05, - 'Response' => 0x06, - 'Status' => 0x07, - 'Type' => 0x08, - 'Recipient' => 0x09, - 'DisplayName' => 0x0A, - 'EmailAddress' => 0x0B, - 'Certificates' => 0x0C, - 'Certificate' => 0x0D, - 'MiniCertificate' => 0x0E, - 'Options' => 0x0F, - 'To' => 0x10, - 'CertificateRetrieval' => 0x11, - 'RecipientCount' => 0x12, - 'MaxCertificates' => 0x13, - 'MaxAmbiguousRecipients' => 0x14, - 'CertificateCount' => 0x15, - 'Availability' => 0x16, - 'StartTime' => 0x17, - 'EndTime' => 0x18, - 'MergedFreeBusy' => 0x19, - // 14.1 - 'Picture' => 0x1A, - 'MaxSize' => 0x1B, - 'Data' => 0x1C, - 'MaxPictures' => 0x1D - ], - // #11 ValidateCert - 0x0B => [ - 'ValidateCert' => 0x05, - 'Certificates' => 0x06, - 'Certificate' => 0x07, - 'CertificateChain' => 0x08, - 'CheckCRL' => 0x09, - 'Status' => 0x0A, - ], - // #12 Contacts2 - 0x0C => [ - 'CustomerId' => 0x05, - 'GovernmentId' => 0x06, - 'IMAddress' => 0x07, - 'IMAddress2' => 0x08, - 'IMAddress3' => 0x09, - 'ManagerName' => 0x0A, - 'CompanyMainPhone' => 0x0B, - 'AccountName' => 0x0C, - 'NickName' => 0x0D, - 'MMS' => 0x0E, - ], - // #13 Ping - 0x0D => [ - 'Ping' => 0x05, - 'AutdState' => 0x06, - 'Status' => 0x07, - 'HeartbeatInterval' => 0x08, - 'Collections' => 0x09, - 'Collection' => 0x0A, - 'EntityId' => 0x0B, - 'CollectionType' => 0x0C, - 'MaxCollections' => 0x0D, - ], - // #14 Provision - 0x0E => [ - 'Provision' => 0x05, - 'Policies' => 0x06, - 'Policy' => 0x07, - 'PolicyType' => 0x08, - 'PolicyKey' => 0x09, - 'Data' => 0x0A, - 'Status' => 0x0B, - 'RemoteWipe' => 0x0C, - 'EASProvisionDoc' => 0x0D, - // EAS 12.0 - 'DevicePasswordEnabled' => 0x0E, - 'AlphanumericDevicePasswordRequired' => 0x0F, - 'DeviceEncryptionEnabled' => 0x10, - 'PasswordRecoveryEnabled' => 0x11, - 'DocumentBrowseEnabled' => 0x12, - 'AttachmentsEnabled' => 0x13, - 'MinDevicePasswordLength' => 0x14, - 'MaxInactivityTimeDeviceLock' => 0x15, - 'MaxDevicePasswordFailedAttempts' => 0x16, - 'MaxAttachmentSize' => 0x17, - 'AllowSimpleDevicePassword' => 0x18, - 'DevicePasswordExpiration' => 0x19, - 'DevicePasswordHistory' => 0x1A, - // EAS 12.1 - 'AllowStorageCard' => 0x1B, - 'AllowCamera' => 0x1C, - 'RequireDeviceEncryption' => 0x1D, - 'AllowUnsignedApplications' => 0x1E, - 'AllowUnsignedInstallationPackages' => 0x1F, - 'MinDevicePasswordComplexCharacters' => 0x20, - 'AllowWiFi' => 0x21, - 'AllowTextMessaging' => 0x22, - 'AllowPOPIMAPEmail' => 0x23, - 'AllowBluetooth' => 0x24, - 'AllowIrDA' => 0x25, - 'RequireManualSyncWhenRoaming' => 0x26, - 'AllowDesktopSync' => 0x27, - 'MaxCalendarAgeFilter' => 0x28, - 'AllowHTMLEmail' => 0x29, - 'MaxEmailAgeFilter' => 0x2A, - 'MaxEmailBodyTruncationSize' => 0x2B, - 'MaxHTMLBodyTruncationSize' => 0x2C, - 'RequireSignedSMIMEMessages' => 0x2D, - 'RequireEncryptedSMIMEMessages' => 0x2E, - 'RequireSignedSMIMEAlgorithm' => 0x2F, - 'RequireEncryptedSMIMEAlgorithm' => 0x30, - 'AllowSMIMEEncryptionAlgorithmNegotiation' => 0x31, - 'AllowSMIMESoftCerts' => 0x32, - 'AllowBrowser' => 0x33, - 'AllowConsumerEmail' => 0x34, - 'AllowRemoteDesktop' => 0x35, - 'AllowInternetSharing' => 0x36, - 'UnapprovedInROMApplicationList' => 0x37, - 'ApplicationName' => 0x38, - 'ApprovedApplicationList' => 0x39, - 'Hash' => 0x3A, - ], - // #15 Search - 0x0F => [ - 'Search' => 0x05, - 'Store' => 0x07, - 'Name' => 0x08, - 'Query' => 0x09, - 'Options' => 0x0A, - 'Range' => 0x0B, - 'Status' => 0x0C, - 'Response' => 0x0D, - 'Result' => 0x0E, - 'Properties' => 0x0F, - 'Total' => 0x10, - 'EqualTo' => 0x11, - 'Value' => 0x12, - 'And' => 0x13, - 'Or' => 0x14, - 'FreeText' => 0x15, - 'DeepTraversal' => 0x17, - 'LongId' => 0x18, - 'RebuildResults' => 0x19, - 'LessThan' => 0x1A, - 'GreaterThan' => 0x1B, - 'Schema' => 0x1C, - 'Supported' => 0x1D, - // EAS 12.1 - 'UserName' => 0x1E, - 'Password' => 0x1F, - 'ConversationId' => 0x20, - // EAS 14.1 - 'Picture' => 0x21, - 'MaxSize' => 0x22, - 'MaxPictures' => 0x23, - ], - // #16 GAL (Global Address List) - 0x10 => [ - 'DisplayName' => 0x05, - 'Phone' => 0x06, - 'Office' => 0x07, - 'Title' => 0x08, - 'Company' => 0x09, - 'Alias' => 0x0A, - 'FirstName' => 0x0B, - 'LastName' => 0x0C, - 'HomePhone' => 0x0D, - 'MobilePhone' => 0x0E, - 'EmailAddress' => 0x0F, - // 14.1 - 'Picture' => 0x10, - 'Status' => 0x11, - 'Data' => 0x12, - ], - // #17 AirSyncBase (12.0) - 0x11 => [ - 'BodyPreference' => 0x05, - 'Type' => 0x06, - 'TruncationSize' => 0x07, - 'AllOrNone' => 0x08, - 'Body' => 0x0A, - 'Data' => 0x0B, - 'EstimatedDataSize' => 0x0C, - 'Truncated' => 0x0D, - 'Attachments' => 0x0E, - 'Attachment' => 0x0F, - 'DisplayName' => 0x10, - 'FileReference' => 0x11, - 'Method' => 0x12, - 'ContentId' => 0x13, - 'ContentLocation' => 0x14, - 'IsInline' => 0x15, - 'NativeBodyType' => 0x16, - 'ContentType' => 0x17, - // EAS 14.0 - 'Preview' => 0x18, - // EAS 14.1 - 'BodyPartPreference' => 0x19, - 'BodyPart' => 0x1A, - 'Status' => 0x1B, - // EAS 16.0 - 'Add' => 0x1C, - 'Delete' => 0x1D, - 'ClientId' => 0x1E, - 'Content' => 0x1F, - 'Location' => 0x20, - 'Annontation' => 0x21, - 'Street' => 0x22, - 'City' => 0x23, - 'State' => 0x24, - 'Country' => 0x25, - 'PostalCode' => 0x26, - 'Latitude' => 0x27, - 'Longitude' => 0x28, - 'Accuracy' => 0x29, - 'Altitude' => 0x2A, - 'AltitudeAccuracy' => 0x2B, - 'LocationUri' => 0x2C, - 'InstanceId' => 0x2D, - ], - // #18 Settings - 0x12 => [ - 'Settings' => 0x05, - 'Status' => 0x06, - 'Get' => 0x07, - 'Set' => 0x08, - 'Oof' => 0x09, - 'OofState' => 0x0A, - 'StartTime' => 0x0B, - 'EndTime' => 0x0C, - 'OofMessage' => 0x0D, - 'AppliesToInternal' => 0x0E, - 'AppliesToExternalKnown' => 0x0F, - 'AppliesToExternalUnknown' => 0x10, - 'Enabled' => 0x11, - 'ReplyMessage' => 0x12, - 'BodyType' => 0x13, - 'DevicePassword' => 0x14, - 'Password' => 0x15, - 'Device' => 0x16, - 'Model' => 0x17, - 'IMEI' => 0x18, - 'FriendlyName' => 0x19, - 'OS' => 0x1A, - 'OSLanguage' => 0x1B, - 'PhoneNumber' => 0x1B, - 'User' => 0x1D, - 'EmailAddresses' => 0x1E, - 'SmtpAddress' => 0x1F, - // EAS 12.1 - 'UserAgent' => 0x20, - // EAS 14.0 - 'EnableOutboundSMS' => 0x21, - 'MobileOperator' => 0x22, - // EAS 14.1 - 'PrimarySmtpAddress' => 0x23, - 'Accounts' => 0x24, - 'Account' => 0x25, - 'AccountId' => 0x26, - 'AccountName' => 0x27, - 'UserDisplayName' => 0x28, - 'SendDisabled' => 0x29, - 'RightsManagementInformation' => 0x2B, - ], - // #19 DocumentLibrary - 0x13 => [ - 'LinkId' => 0x05, - 'DisplayName' => 0x06, - 'IsCollection' => 0x07, - 'CreationDate' => 0x08, - 'LastModifiedDate' => 0x09, - 'IsHidden' => 0x0A, - 'ContentLength' => 0x0B, - 'ContentType' => 0x0C, - ], - // #20 EntityOperations - 0x14 => [ - 'EntityOperations' => 0x05, - 'Fetch' => 0x06, - 'Store' => 0x07, - 'Options' => 0x08, - 'Range' => 0x09, - 'Total' => 0x0A, - 'Properties' => 0x0B, - 'Data' => 0x0C, - 'Status' => 0x0D, - 'Response' => 0x0E, - 'Version' => 0x0F, - 'Schema' => 0x10, - 'Part' => 0x11, - 'EmptyCollectionContent' => 0x12, - 'DeleteSubCollections' => 0x13, - // EAS 12.1 - 'UserName' => 0x14, - 'Password' => 0x15, - // EAS 14.0 - 'Move' => 0x16, - 'DstFldId' => 0x17, - 'ConversationId' => 0x18, - 'MoveAlways' => 0x19, - ], - // #21 ComposeMail (14.0) - 0x15 => [ - 'SendMail' => 0x05, - 'SmartForward' => 0x06, - 'SmartReply' => 0x07, - 'SaveInSentEntitys' => 0x08, - 'ReplaceMime' => 0x09, - 'Type' => 0x0A, - 'Source' => 0x0B, - 'CollectionId' => 0x0C, - 'EntityId' => 0x0D, - 'LongId' => 0x0E, - 'InstanceId' => 0x0F, - 'MIME' => 0x10, - 'ClientId' => 0x11, - 'Status' => 0x12, - // 14.1 - 'AccountId' => 0x13, - // EAS 16.0 - 'Forwardees' => 0x15, - 'Forwardee' => 0x16, - 'ForwardeeName' => 0x17, - 'ForwardeeEmail' => 0x18 - ], - // #22 Email2 (14.0) - 0x16 => [ - 'UmCallerId' => 0x05, - 'UmUserNotes' => 0x06, - 'UmAttDuration' => 0x07, - 'UmAttOrder' => 0x08, - 'ConversationId' => 0x09, - 'ConversationIndex' => 0x0A, - 'LastVerbExecuted' => 0x0B, - 'LastVerbExecutionTime' => 0x0C, - 'ReceivedAsBcc' => 0x0D, - 'Sender' => 0x0E, - 'CalendarType' => 0x0F, - 'IsLeapMonth' => 0x10, - // 14.1 - 'AccountId' => 0x11, - 'FirstDayOfWeek' => 0x12, - 'MeetingMessageType' => 0x13, - // EAS 16.0 - 'IsDraft' => 0x15, - 'Bcc' => 0x16, - 'Send' => 0x17 - ], - // #23 Notes (14.0) - 0x17 => [ - 'Subject' => 0x05, - 'MessageClass' => 0x06, - 'LastModifiedDate' => 0x07, - 'Categories' => 0x08, - 'Category' => 0x09 - ], - // #24 RightsManagement (14.1) - 0x18 => [ - 'RightsManagementSupport' => 0x05, - 'RightsManagementTemplates' => 0x06, - 'RightsManagementTemplate' => 0x07, - 'RightsManagementLicense' => 0x08, - 'EditAllowed' => 0x09, - 'ReplyAllowed' => 0x0A, - 'ReplyAllAllowed' => 0x0B, - 'ForwardAllowed' => 0x0C, - 'ModifyRecipientsAllowed' => 0x0D, - 'ExtractAllowed' => 0x0E, - 'PrintAllowed' => 0x0F, - 'ExportAllowed' => 0x10, - 'ProgrammaticAccessAllowed' => 0x11, - 'Owner' => 0x12, - 'ContentExpiryDate' => 0x13, - 'TemplateID' => 0x14, - 'TemplateName' => 0x15, - 'TemplateDescription' => 0x16, - 'ContentOwner' => 0x17, - 'RemoveRightsManagementDistribution' => 0x18 - ], - // #25 Find - 0x19 => [ - 'Find' => 0x05, - 'SearchId' => 0x06, - 'Search' => 0x07, - 'Criterion' => 0x08, - 'Query' => 0x09, - 'Status' => 0x0A, - 'FreeText' => 0x0B, - 'Options' => 0x0C, - 'Range' => 0x0D, - 'DeepTraversal' => 0x0E, - 'Response' => 0x11, - 'Result' => 0x12, - 'Properties' => 0x13, - 'Preview' => 0x14, - 'HasAttachments' => 0x15 - ], - // #254 Windows Live - 0xFE => [ - 'Annotations' => 0x05, - 'Annotation' => 0x06, - 'Name' => 0x07, - 'Value' => 0x08 - ] - ]; - - /** - * WBXMLDecoder constructor - */ - public function __construct() { - - } - - /** - * convert object to string - * - * @param $data - * - * @throws Throwable - */ - public function stringFromObject($object): string { - - // construct stream object - $stream = fopen('php://temp', 'rw'); - // - $this->streamFromObject($stream, $object); - // rewind to beggining of stream - rewind($stream); - // - $data = stream_get_contents($stream); - // close stream - fclose($stream); - - return $data; - - } - - /** - * convert object to wbxml binary - * - * @param $stream output stream - * @param $object object to convert stream - * - */ - public function streamFromObject($stream, $object): void { - - // write header - $this->_writeByte($stream, EasXml::VERSION_V13); - $this->_writeMBUInt($stream, EasXml::IDENTIFIER); - $this->_writeMBUInt($stream, EasXml::ENCODING); - $this->_writeMBUInt($stream, 0); - // write body - $page = 0; - $this->_writeBodyFromObject($stream, $object, $page); - - } - - /** - * write eas object as wbxml binary - * - * @param $stream output stream - * @param $object object to convert - * @param $page namespace code page - * - */ - private function _writeBodyFromObject($stream, $object, &$page): void { - - foreach (get_object_vars($object) as $token => $property) { - - $namespace = $property->getNamespace(); - - if ($page !== self::$_namespaces[$namespace]) { - $page = self::$_namespaces[$namespace]; - $this->_writeByte($stream, EasXml::CODESPACE); - $this->_writeByte($stream, $page); - } - - if ($property instanceof EasObject) { - - // write node start - $this->_writeNodeStart($stream, $page, $token, true, false); - // write node contents - $this->_writeBodyFromObject($stream, $property, $page); - // write node end - $this->_writeNodeEnd($stream); - - } - elseif ($property instanceof EasProperty) { - - if ($property->hasContents()) { - // write node start - $this->_writeNodeStart($stream, $page, $token, true, false); - if ($property->getOpaque()) { - // write node contents - $this->_writeData($stream, $property->getContents()); - } - else { - // write node contents - $this->_writeString($stream, $property->getContents()); - } - // write node end - $this->_writeNodeEnd($stream); - } - else { - // write node start - $this->_writeNodeStart($stream, $page, $token, false, false); - } - - } - elseif ($property instanceof EasCollection) { - $cpage = $page; - foreach ($property as $entry) { - // evaluate if code page changed on the last iteration - if ($cpage != $page) { - $page = $cpage; - $this->_writeByte($stream, EasXml::CODESPACE); - $this->_writeByte($stream, $page); - } - // write node start - $this->_writeNodeStart($stream, $page, $token, true, false); - // write node contents - $this->_writeBodyFromObject($stream, $entry, $page); - // write node end - $this->_writeNodeEnd($stream); - } - - } - } - - } - - /** - * write node start as wbxml binary - * - * @param $stream output stream - * @param $space codespace - * @param $name named token - * @param $contents contents flag - * @param $attributes attributes flag - * - */ - private function _writeNodeStart($stream, int $space, string $name, bool $contents = false, bool $attributes = false): void { - - // convert named token to token code - $code = self::$_codes[$space][$name]; - // evaluate, if code was found - if (!isset($code)) { - throw new \UnexpectedValueException("Unknown token encountered $space:$name"); - } - // alter code depenting on flags - if ($attributes) { - $code |= EasXml::NODE_CONTENTS; - } elseif ($contents) { - $code |= EasXml::NODE_CONTENTS; - } - // write node start token to stream - $this->_writeByte($stream, $code); - - } - - /** - * write byte as wbxml binary - * - * @param $stream output stream - * @param $byte byte to write - * - */ - private function _writeNodeEnd($stream, ): void { - - // write node end token to stream - $this->_writeByte($stream, EasXml::NODE_END); - - } - - /** - * write byte as wbxml binary - * - * @param $stream output stream - * @param $byte byte to write - * - */ - private function _writeByte($stream, $byte): void { - // write byte to stream - fwrite($stream, chr($byte)); - } - - /** - * write integer as wbxml multibyte binary - * - * @param $stream output stream - * @param $int int to write - * - */ - private function _writeMBUInt($stream, $int): void { - - while (1) { - $byte = $int & 0x7f; - $int = $int >> 7; - if ($int == 0) { - $this->_writeByte($stream, $byte); - break; - } else { - $this->_writeByte($stream, $byte | 0x80); - } - } - - } - - /** - * write string as wbxml binary - * - * @param $stream output stream - * @param $content content to write - * - */ - private function _writeString($stream, $content): void { - - // replace any termination character in string - $content = str_replace("\0", '', $content); - // write string start token - $this->_writeByte($stream, EasXml::STRING_INLINE); - // write string - fwrite($stream, $content); - // write string end token - $this->_writeByte($stream, 0); - - } - - /** - * write opeque data as wbxml binary - * - * @param $stream output stream - * @param $content data to write - * - */ - private function _writeData($stream, $content): void { - - // write data start token - $this->_writeByte($stream, EasXml::DATA); - // write data lenght - $this->_writeMBUInt($stream, strlen($content)); - // write data - fwrite($stream, $content); - - } - -} \ No newline at end of file diff --git a/lib/Utile/TimeZoneEAS.php b/lib/Utile/TimeZoneEAS.php deleted file mode 100644 index af85074..0000000 --- a/lib/Utile/TimeZoneEAS.php +++ /dev/null @@ -1,951 +0,0 @@ - -* -* @author Sebastian Krupinski -* -* @license AGPL-3.0-or-later -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Affero General Public License as -* published by the Free Software Foundation, either version 3 of the -* License, or (at your option) any later version. -* -* This program 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 Affero General Public License for more details. -* -* You should have received a copy of the GNU Affero General Public License -* along with this program. If not, see . -* -*/ - -namespace OCA\JMAPC\Utile; - -use DateTimeZone; - -class TimeZoneEAS { - - /** - * table of EAS (Microsoft/Windows) time zones information - * @var array $easzones - */ - private static $easzones = [ - 'AUS Central Standard Time' => '{"Id":"AUS Central Standard Time","Description":"(UTC+09:30) Darwin","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-570,"Period":"-PT9H30M"}]}]}', - 'Aus Central W. Standard Time' => '{"Id":"Aus Central W. Standard Time","Description":"(UTC+08:45) Eucla","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-525,"Period":"-PT8H45M"}]}]}', - 'AUS Eastern Standard Time' => '{"Id":"AUS Eastern Standard Time","Description":"(UTC+10:00) Canberra, Melbourne, Sydney","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":4,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Afghanistan Standard Time' => '{"Id":"Afghanistan Standard Time","Description":"(UTC+04:30) Kabul","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-270,"Period":"-PT4H30M"}]}]}', - 'Alaskan Standard Time' => '{"Id":"Alaskan Standard Time","Description":"(UTC-09:00) Alaska","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":480,"Period":"PT8H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":540,"Period":"PT9H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":480,"Period":"PT8H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":540,"Period":"PT9H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Aleutian Standard Time' => '{"Id":"Aleutian Standard Time","Description":"(UTC-10:00) Aleutian Islands","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":540,"Period":"PT9H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":600,"Period":"PT10H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":540,"Period":"PT9H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":600,"Period":"PT10H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Altai Standard Time' => '{"Id":"Altai Standard Time","Description":"(UTC+07:00) Barnaul, Gorno-Altaysk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]}]}', - 'Arab Standard Time' => '{"Id":"Arab Standard Time","Description":"(UTC+03:00) Kuwait, Riyadh","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'Arabian Standard Time' => '{"Id":"Arabian Standard Time","Description":"(UTC+04:00) Abu Dhabi, Muscat","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Arabic Standard Time' => '{"Id":"Arabic Standard Time","Description":"(UTC+03:00) Baghdad","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2004-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":4,"Week":1,"Day":"Thursday","Time":"PT3H"},{"Id":"2004-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":1,"Day":"Friday","Time":"PT4H"}]},{"Id":"1","Effective":1104537600,"Type":"Dynamic","Alterations":[{"Id":"2005-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":4,"Week":1,"Day":"Friday","Time":"PT3H"},{"Id":"2005-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT4H"}]},{"Id":"2","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT3H"},{"Id":"2006-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":1,"Day":"Sunday","Time":"PT4H"}]},{"Id":"3","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":4,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2007-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":1,"Day":"Monday","Time":"PT4H"}]},{"Id":"4","Effective":1199145600,"Type":"Static","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'Argentina Standard Time' => '{"Id":"Argentina Standard Time","Description":"(UTC-03:00) City of Buenos Aires","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":1,"Week":1,"Day":"Monday","Time":"PT0H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":12,"Week":-1,"Day":"Sunday","Time":"PT0H"}]},{"Id":"2","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":3,"Week":3,"Day":"Sunday","Time":"PT0H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2009-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":3,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]}]}', - 'Astrakhan Standard Time' => '{"Id":"Astrakhan Standard Time","Description":"(UTC+04:00) Astrakhan, Ulyanovsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Atlantic Standard Time' => '{"Id":"Atlantic Standard Time","Description":"(UTC-04:00) Atlantic Time (Canada)","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Azerbaijan Standard Time' => '{"Id":"Azerbaijan Standard Time","Description":"(UTC+04:00) Baku","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-300,"Period":"-PT5H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT4H"},{"Id":"2015-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT5H"}]},{"Id":"1","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Azores Standard Time' => '{"Id":"Azores Standard Time","Description":"(UTC-01:00) Azores","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":0,"Period":"PT0H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT0H"},{"Id":"1-Standard","Class":"Standard","Bias":60,"Period":"PT1H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1H"}]}]}', - 'Bahia Standard Time' => '{"Id":"Bahia Standard Time","Description":"(UTC-03:00) Salvador","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2012-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]}]}', - 'Bangladesh Standard Time' => '{"Id":"Bangladesh Standard Time","Description":"(UTC+06:00) Dhaka","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]},{"Id":"1","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":6,"Week":3,"Day":"Friday","Time":"PT23H"},{"Id":"2009-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":12,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]}]}', - 'Belarus Standard Time' => '{"Id":"Belarus Standard Time","Description":"(UTC+03:00) Minsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'Bougainville Standard Time' => '{"Id":"Bougainville Standard Time","Description":"(UTC+11:00) Bougainville Island","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]},{"Id":"1","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":12,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]}]}', - 'Canada Central Standard Time' => '{"Id":"Canada Central Standard Time","Description":"(UTC-06:00) Saskatchewan","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":360,"Period":"PT6H"}]}]}', - 'Cape Verde Standard Time' => '{"Id":"Cape Verde Standard Time","Description":"(UTC-01:00) Cabo Verde Is.","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":60,"Period":"PT1H"}]}]}', - 'Caucasus Standard Time' => '{"Id":"Caucasus Standard Time","Description":"(UTC+04:00) Yerevan","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-300,"Period":"-PT5H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2011-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Cen. Australia Standard Time' => '{"Id":"Cen. Australia Standard Time","Description":"(UTC+09:30) Adelaide","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-570,"Period":"-PT9H30M","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":-630,"Period":"-PT10H30M","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-570,"Period":"-PT9H30M","Month":4,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-630,"Period":"-PT10H30M","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Central America Standard Time' => '{"Id":"Central America Standard Time","Description":"(UTC-06:00) Central America","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":360,"Period":"PT6H"}]}]}', - 'Central Asia Standard Time' => '{"Id":"Central Asia Standard Time","Description":"(UTC+06:00) Astana","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]}]}', - 'Central Brazilian Standard Time' => '{"Id":"Central Brazilian Standard Time","Description":"(UTC-04:00) Cuiaba","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2004-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2004-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":11,"Week":1,"Day":"Tuesday","Time":"PT0H"}]},{"Id":"1","Effective":1104537600,"Type":"Dynamic","Alterations":[{"Id":"2005-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2005-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Sunday","Time":"PT0H"}]},{"Id":"2","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2006-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":11,"Week":1,"Day":"Sunday","Time":"PT0H"}]},{"Id":"3","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2007-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Sunday","Time":"PT0H"}]},{"Id":"4","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2008-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Sunday","Time":"PT0H"}]},{"Id":"5","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2009-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2010-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2011-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2012-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"9","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2013-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2014-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2015-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2016-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"13","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2017-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"14","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2018-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":11,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"15","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2019-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":2,"Week":3,"Day":"Sunday","Time":"PT0H"}]},{"Id":"16","Effective":1577836800,"Type":"Static","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":240,"Period":"PT4H"}]}]}', - 'Central Europe Standard Time' => '{"Id":"Central Europe Standard Time","Description":"(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"1-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]}]}', - 'Central European Standard Time' => '{"Id":"Central European Standard Time","Description":"(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"1-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]}]}', - 'Central Pacific Standard Time' => '{"Id":"Central Pacific Standard Time","Description":"(UTC+11:00) Solomon Is., New Caledonia","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]}]}', - 'Central Standard Time' => '{"Id":"Central Standard Time","Description":"(UTC-06:00) Central Time (US & Canada)","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Central Standard Time (Mexico)' => '{"Id":"Central Standard Time (Mexico)","Description":"(UTC-06:00) Guadalajara, Mexico City, Monterrey","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2022-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2022-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1672531200,"Type":"Static","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":360,"Period":"PT6H"}]}]}', - 'Chatham Islands Standard Time' => '{"Id":"Chatham Islands Standard Time","Description":"(UTC+12:45) Chatham Islands","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":-765,"Period":"-PT12H45M","Month":3,"Week":3,"Day":"Sunday","Time":"PT3H45M"},{"Id":"2006-Daylight","Class":"Daylight","Bias":-825,"Period":"-PT13H45M","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H45M"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-765,"Period":"-PT12H45M","Month":3,"Week":3,"Day":"Sunday","Time":"PT3H45M"},{"Id":"2007-Daylight","Class":"Daylight","Bias":-825,"Period":"-PT13H45M","Month":9,"Week":-1,"Day":"Sunday","Time":"PT2H45M"}]},{"Id":"2","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-765,"Period":"-PT12H45M","Month":4,"Week":1,"Day":"Sunday","Time":"PT3H45M"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-825,"Period":"-PT13H45M","Month":9,"Week":-1,"Day":"Sunday","Time":"PT2H45M"}]}]}', - 'China Standard Time' => '{"Id":"China Standard Time","Description":"(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]}]}', - 'Cuba Standard Time' => '{"Id":"Cuba Standard Time","Description":"(UTC-05:00) Havana","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2003-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2003-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1H"}]},{"Id":"1","Effective":1072915200,"Type":"Dynamic","Alterations":[{"Id":"2004-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2004-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT0H"}]},{"Id":"2","Effective":1104537600,"Type":"Static","Alterations":[{"Id":"2005-Standard","Class":"Standard","Bias":240,"Period":"PT4H"}]},{"Id":"3","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2006-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1H"}]},{"Id":"4","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT0H"},{"Id":"2007-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1H"}]},{"Id":"5","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":3,"Day":"Sunday","Time":"PT0H"},{"Id":"2008-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1H"}]},{"Id":"6","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT0H"},{"Id":"2009-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1H"}]},{"Id":"7","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT0H"},{"Id":"2010-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1H"}]},{"Id":"8","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":3,"Day":"Sunday","Time":"PT0H"},{"Id":"2011-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":2,"Day":"Sunday","Time":"PT1H"}]},{"Id":"9","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2012-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT1H"}]},{"Id":"10","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT0H"},{"Id":"2013-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT1H"}]}]}', - 'Dateline Standard Time' => '{"Id":"Dateline Standard Time","Description":"(UTC-12:00) International Date Line West","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":720,"Period":"PT12H"}]}]}', - 'E. Africa Standard Time' => '{"Id":"E. Africa Standard Time","Description":"(UTC+03:00) Nairobi","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'E. Australia Standard Time' => '{"Id":"E. Australia Standard Time","Description":"(UTC+10:00) Brisbane","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]}]}', - 'E. Europe Standard Time' => '{"Id":"E. Europe Standard Time","Description":"(UTC+02:00) Chisinau","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"1-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]}]}', - 'E. South America Standard Time' => '{"Id":"E. South America Standard Time","Description":"(UTC-03:00) Brasilia","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2004-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2004-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":11,"Week":1,"Day":"Tuesday","Time":"PT0H"}]},{"Id":"1","Effective":1104537600,"Type":"Dynamic","Alterations":[{"Id":"2005-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2005-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Sunday","Time":"PT0H"}]},{"Id":"2","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2006-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":11,"Week":1,"Day":"Sunday","Time":"PT0H"}]},{"Id":"3","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2007-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":2,"Day":"Sunday","Time":"PT0H"}]},{"Id":"4","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2008-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Sunday","Time":"PT0H"}]},{"Id":"5","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2009-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2010-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2011-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2012-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"9","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2013-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2014-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2015-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2016-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"13","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2017-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"14","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2018-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":11,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"15","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2019-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Sunday","Time":"PT0H"}]},{"Id":"16","Effective":1577836800,"Type":"Static","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]}]}', - 'Easter Island Standard Time' => '{"Id":"Easter Island Standard Time","Description":"(UTC-06:00) Easter Island","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":3,"Week":2,"Day":"Saturday","Time":"PT22H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":10,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":10,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"2","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":3,"Week":2,"Day":"Saturday","Time":"PT22H"},{"Id":"2009-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":10,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"3","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Saturday","Time":"PT22H"},{"Id":"2010-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":10,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"4","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":5,"Week":1,"Day":"Saturday","Time":"PT22H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":8,"Week":3,"Day":"Saturday","Time":"PT22H"}]},{"Id":"5","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2012-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":1,"Day":"Saturday","Time":"PT22H"}]},{"Id":"6","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2013-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":1,"Day":"Saturday","Time":"PT22H"}]},{"Id":"7","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2014-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":1,"Day":"Saturday","Time":"PT22H"}]},{"Id":"8","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"9","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":5,"Week":2,"Day":"Saturday","Time":"PT22H"},{"Id":"2016-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":8,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"10","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":5,"Week":2,"Day":"Saturday","Time":"PT22H"},{"Id":"2017-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":8,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"11","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":5,"Week":2,"Day":"Saturday","Time":"PT22H"},{"Id":"2018-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":8,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"12","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Saturday","Time":"PT22H"},{"Id":"2019-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":1,"Day":"Saturday","Time":"PT22H"}]},{"Id":"13","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Saturday","Time":"PT22H"},{"Id":"2020-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":1,"Day":"Saturday","Time":"PT22H"}]},{"Id":"14","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Saturday","Time":"PT22H"},{"Id":"2021-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":1,"Day":"Saturday","Time":"PT22H"}]},{"Id":"15","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Saturday","Time":"PT22H"},{"Id":"2022-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":2,"Day":"Saturday","Time":"PT22H"}]},{"Id":"16","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Saturday","Time":"PT22H"},{"Id":"2023-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":9,"Week":1,"Day":"Saturday","Time":"PT22H"}]}]}', - 'Eastern Standard Time' => '{"Id":"Eastern Standard Time","Description":"(UTC-05:00) Eastern Time (US & Canada)","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Eastern Standard Time (Mexico)' => '{"Id":"Eastern Standard Time (Mexico)","Description":"(UTC-05:00) Chetumal","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2014-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":360,"Period":"PT6H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2015-Daylight","Class":"Daylight","Bias":300,"Period":"PT5H","Month":2,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]}]}', - 'Egypt Standard Time' => '{"Id":"Egypt Standard Time","Description":"(UTC+02:00) Cairo","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2005-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2005-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"1","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2006-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":3,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2007-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2008-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":8,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":4,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2009-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":8,"Week":3,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2010-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1293840000,"Type":"Static","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"7","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"8","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"9","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":5,"Week":3,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"11","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"12","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"13","Effective":1514764800,"Type":"Static","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"14","Effective":1546300800,"Type":"Static","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"15","Effective":1577836800,"Type":"Static","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"16","Effective":1609459200,"Type":"Static","Alterations":[{"Id":"2021-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"17","Effective":1640995200,"Type":"Static","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"18","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2023-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]}]}', - 'Ekaterinburg Standard Time' => '{"Id":"Ekaterinburg Standard Time","Description":"(UTC+05:00) Ekaterinburg","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H"}]}]}', - 'FLE Standard Time' => '{"Id":"FLE Standard Time","Description":"(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"1-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT4H"}]}]}', - 'Fiji Standard Time' => '{"Id":"Fiji Standard Time","Description":"(UTC+12:00) Fiji","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]},{"Id":"1","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2009-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":11,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2010-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":10,"Week":4,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":3,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":10,"Week":4,"Day":"Sunday","Time":"PT2H"}]},{"Id":"4","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":4,"Day":"Sunday","Time":"PT3H"},{"Id":"2012-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":10,"Week":3,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2013-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":10,"Week":4,"Day":"Sunday","Time":"PT2H"}]},{"Id":"6","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":3,"Day":"Sunday","Time":"PT2H"},{"Id":"2014-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2015-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"8","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2016-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"9","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2017-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"10","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":2,"Day":"Sunday","Time":"PT3H"},{"Id":"2018-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"11","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":2,"Day":"Sunday","Time":"PT3H"},{"Id":"2019-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":11,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"12","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":2,"Day":"Sunday","Time":"PT3H"},{"Id":"2020-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":12,"Week":3,"Day":"Sunday","Time":"PT2H"}]},{"Id":"13","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2021-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":1,"Week":3,"Day":"Sunday","Time":"PT3H"}]},{"Id":"14","Effective":1640995200,"Type":"Static","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]}]}', - 'GMT Standard Time' => '{"Id":"GMT Standard Time","Description":"(UTC+00:00) Dublin, Edinburgh, Lisbon, London","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT1H"},{"Id":"1-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'GTB Standard Time' => '{"Id":"GTB Standard Time","Description":"(UTC+02:00) Athens, Bucharest","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"1-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT4H"}]}]}', - 'Georgian Standard Time' => '{"Id":"Georgian Standard Time","Description":"(UTC+04:00) Tbilisi","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Greenland Standard Time' => '{"Id":"Greenland Standard Time","Description":"(UTC-03:00) Greenland","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2004-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2004-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"1","Effective":1104537600,"Type":"Dynamic","Alterations":[{"Id":"2005-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2005-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"2","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2006-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"3","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":4,"Day":"Saturday","Time":"PT22H"},{"Id":"2007-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"4","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2008-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"5","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2009-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":4,"Day":"Saturday","Time":"PT23H"}]},{"Id":"6","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2010-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"7","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2011-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"8","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":4,"Day":"Saturday","Time":"PT22H"},{"Id":"2012-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"9","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2013-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"10","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2014-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"11","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2015-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":4,"Day":"Saturday","Time":"PT23H"}]},{"Id":"12","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2016-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"13","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2017-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"14","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":4,"Day":"Saturday","Time":"PT22H"},{"Id":"2018-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"15","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2019-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]},{"Id":"16","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2020-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":4,"Day":"Saturday","Time":"PT23H"}]},{"Id":"17","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT22H"},{"Id":"2021-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H"}]}]}', - 'Greenwich Standard Time' => '{"Id":"Greenwich Standard Time","Description":"(UTC+00:00) Monrovia, Reykjavik","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":0,"Period":"PT0H"}]}]}', - 'Haiti Standard Time' => '{"Id":"Haiti Standard Time","Description":"(UTC-05:00) Haiti","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2006-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"1","Effective":1167609600,"Type":"Static","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"2","Effective":1199145600,"Type":"Static","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"3","Effective":1230768000,"Type":"Static","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"4","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"5","Effective":1293840000,"Type":"Static","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"6","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2012-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2013-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"8","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2014-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"9","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2015-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"10","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"11","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2017-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Hawaiian Standard Time' => '{"Id":"Hawaiian Standard Time","Description":"(UTC-10:00) Hawaii","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":600,"Period":"PT10H"}]}]}', - 'India Standard Time' => '{"Id":"India Standard Time","Description":"(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-330,"Period":"-PT5H30M"}]}]}', - 'Iran Standard Time' => '{"Id":"Iran Standard Time","Description":"(UTC+03:30) Tehran","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2004-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":3,"Day":"Sunday","Time":"PT0H"},{"Id":"2004-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Monday","Time":"PT23H59M59.999S"}]},{"Id":"1","Effective":1104537600,"Type":"Dynamic","Alterations":[{"Id":"2005-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Tuesday","Time":"PT0H"},{"Id":"2005-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Wednesday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1136073600,"Type":"Static","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M"}]},{"Id":"3","Effective":1167609600,"Type":"Static","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M"}]},{"Id":"4","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":3,"Day":"Friday","Time":"PT0H"},{"Id":"2008-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Sunday","Time":"PT0H"},{"Id":"2009-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Monday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Monday","Time":"PT0H"},{"Id":"2010-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Tuesday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Tuesday","Time":"PT0H"},{"Id":"2011-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Wednesday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":3,"Day":"Wednesday","Time":"PT0H"},{"Id":"2012-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"9","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Friday","Time":"PT0H"},{"Id":"2013-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Saturday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Sunday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Sunday","Time":"PT0H"},{"Id":"2015-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Monday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":3,"Day":"Monday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Tuesday","Time":"PT23H59M59.999S"}]},{"Id":"13","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Wednesday","Time":"PT0H"},{"Id":"2017-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"14","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Thursday","Time":"PT0H"},{"Id":"2018-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"15","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Friday","Time":"PT0H"},{"Id":"2019-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"16","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":3,"Day":"Saturday","Time":"PT0H"},{"Id":"2020-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Sunday","Time":"PT23H59M59.999S"}]},{"Id":"17","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Monday","Time":"PT0H"},{"Id":"2021-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Tuesday","Time":"PT23H59M59.999S"}]},{"Id":"18","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Daylight","Class":"Daylight","Bias":-270,"Period":"-PT4H30M","Month":3,"Week":4,"Day":"Tuesday","Time":"PT0H"},{"Id":"2022-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M","Month":9,"Week":3,"Day":"Wednesday","Time":"PT23H59M59.999S"}]},{"Id":"19","Effective":1672531200,"Type":"Static","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":-210,"Period":"-PT3H30M"}]}]}', - 'Israel Standard Time' => '{"Id":"Israel Standard Time","Description":"(UTC+02:00) Jerusalem","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2004-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Wednesday","Time":"PT1H"},{"Id":"2004-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":4,"Day":"Wednesday","Time":"PT1H"}]},{"Id":"1","Effective":1104537600,"Type":"Dynamic","Alterations":[{"Id":"2005-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Friday","Time":"PT2H"},{"Id":"2005-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":3,"Day":"Sunday","Time":"PT2H"}]},{"Id":"4","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2008-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2009-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"6","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Friday","Time":"PT2H"},{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"8","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2012-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":4,"Day":"Sunday","Time":"PT2H"}]},{"Id":"9","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2013-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"10","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"11","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"12","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2016-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"13","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Friday","Time":"PT2H"},{"Id":"2017-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"14","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Friday","Time":"PT2H"},{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"15","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2019-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"16","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2020-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"17","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2021-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"18","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2022-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"19","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Friday","Time":"PT2H"},{"Id":"2023-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"20","Effective":1704067200,"Type":"Dynamic","Alterations":[{"Id":"2024-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT2H"},{"Id":"2024-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Jordan Standard Time' => '{"Id":"Jordan Standard Time","Description":"(UTC+03:00) Amman","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"1","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2012-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2013-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":12,"Week":3,"Day":"Friday","Time":"PT0H"}]},{"Id":"3","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"4","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"5","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2016-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"6","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2017-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"7","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"8","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2019-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"9","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2020-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"10","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2021-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"11","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2022-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":2,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1672531200,"Type":"Static","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'Kaliningrad Standard Time' => '{"Id":"Kaliningrad Standard Time","Description":"(UTC+02:00) Kaliningrad","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]}]}', - 'Kamchatka Standard Time' => '{"Id":"Kamchatka Standard Time","Description":"(UTC+12:00) Petropavlovsk-Kamchatsky - Old","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"1-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]}]}', - 'Korea Standard Time' => '{"Id":"Korea Standard Time","Description":"(UTC+09:00) Seoul","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]}]}', - 'Libya Standard Time' => '{"Id":"Libya Standard Time","Description":"(UTC+02:00) Tripoli","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]},{"Id":"1","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2012-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H","Month":11,"Week":2,"Day":"Saturday","Time":"PT2H"}]},{"Id":"2","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2013-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":3,"Week":-1,"Day":"Friday","Time":"PT1H"}]},{"Id":"3","Effective":1388534400,"Type":"Static","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]}]}', - 'Line Islands Standard Time' => '{"Id":"Line Islands Standard Time","Description":"(UTC+14:00) Kiritimati Island","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-840,"Period":"-PT14H"}]}]}', - 'Lord Howe Standard Time' => '{"Id":"Lord Howe Standard Time","Description":"(UTC+10:30) Lord Howe Island","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2005-Standard","Class":"Standard","Bias":-630,"Period":"-PT10H30M","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2005-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":-630,"Period":"-PT10H30M","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-630,"Period":"-PT10H30M","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-630,"Period":"-PT10H30M","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Magadan Standard Time' => '{"Id":"Magadan Standard Time","Description":"(UTC+11:00) Magadan","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":4,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]}]}', - 'Magallanes Standard Time' => '{"Id":"Magallanes Standard Time","Description":"(UTC-03:00) Punta Arenas","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2007-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2008-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2009-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2010-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":5,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2011-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":8,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2012-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2013-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2014-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]},{"Id":"9","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":5,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2016-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":8,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]}]}', - 'Marquesas Standard Time' => '{"Id":"Marquesas Standard Time","Description":"(UTC-09:30) Marquesas Islands","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":570,"Period":"PT9H30M"}]}]}', - 'Mauritius Standard Time' => '{"Id":"Mauritius Standard Time","Description":"(UTC+04:00) Port Louis","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-300,"Period":"-PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-300,"Period":"-PT5H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2009-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Mid-Atlantic Standard Time' => '{"Id":"Mid-Atlantic Standard Time","Description":"(UTC-02:00) Mid-Atlantic - Old","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":60,"Period":"PT1H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"1-Standard","Class":"Standard","Bias":120,"Period":"PT2H","Month":9,"Week":-1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Middle East Standard Time' => '{"Id":"Middle East Standard Time","Description":"(UTC+02:00) Beirut","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT0H"},{"Id":"2009-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT0H"}]},{"Id":"1","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2010-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2012-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2013-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2016-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2017-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"9","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2019-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2020-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2021-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]}]}', - 'Montevideo Standard Time' => '{"Id":"Montevideo Standard Time","Description":"(UTC-03:00) Montevideo","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2014-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2015-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]}]}', - 'Morocco Standard Time' => '{"Id":"Morocco Standard Time","Description":"(UTC+01:00) Casablanca","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":0,"Period":"PT0H"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":5,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2008-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":8,"Week":-1,"Day":"Sunday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":5,"Week":-1,"Day":"Sunday","Time":"PT23H59M59.999S"},{"Id":"2009-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":8,"Week":3,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":5,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2010-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":8,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2011-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":7,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":4,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2012-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":9,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"6","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":4,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2013-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"7","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2014-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"8","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2015-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"9","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2016-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"10","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2017-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"11","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":4,"Day":"Sunday","Time":"PT2H"},{"Id":"2018-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":10,"Week":4,"Day":"Sunday","Time":"PT3H"}]},{"Id":"12","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2019-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":6,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"13","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":4,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2020-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":5,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"14","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":4,"Week":2,"Day":"Sunday","Time":"PT3H"},{"Id":"2021-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":5,"Week":3,"Day":"Sunday","Time":"PT2H"}]},{"Id":"15","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2022-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":5,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"16","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":3,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2023-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":4,"Week":4,"Day":"Sunday","Time":"PT2H"}]},{"Id":"17","Effective":1704067200,"Type":"Dynamic","Alterations":[{"Id":"2024-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":3,"Week":2,"Day":"Sunday","Time":"PT3H"},{"Id":"2024-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":4,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"18","Effective":1735689600,"Type":"Dynamic","Alterations":[{"Id":"2025-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":2,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2025-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"19","Effective":1767225600,"Type":"Dynamic","Alterations":[{"Id":"2026-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":2,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2026-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":4,"Day":"Sunday","Time":"PT2H"}]},{"Id":"20","Effective":1798761600,"Type":"Dynamic","Alterations":[{"Id":"2027-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":2,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2027-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"21","Effective":1830297600,"Type":"Dynamic","Alterations":[{"Id":"2028-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":1,"Week":4,"Day":"Sunday","Time":"PT3H"},{"Id":"2028-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":3,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"22","Effective":1861920000,"Type":"Dynamic","Alterations":[{"Id":"2029-Standard","Class":"Standard","Bias":0,"Period":"PT0H","Month":1,"Week":2,"Day":"Sunday","Time":"PT3H"},{"Id":"2029-Daylight","Class":"Daylight","Bias":-60,"Period":"-PT1H","Month":2,"Week":3,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Mountain Standard Time' => '{"Id":"Mountain Standard Time","Description":"(UTC-07:00) Mountain Time (US & Canada)","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":420,"Period":"PT7H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":360,"Period":"PT6H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":420,"Period":"PT7H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Mountain Standard Time (Mexico)' => '{"Id":"Mountain Standard Time (Mexico)","Description":"(UTC-07:00) La Paz, Mazatlan","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2022-Daylight","Class":"Daylight","Bias":360,"Period":"PT6H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2022-Standard","Class":"Standard","Bias":420,"Period":"PT7H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1672531200,"Type":"Static","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":420,"Period":"PT7H"}]}]}', - 'Myanmar Standard Time' => '{"Id":"Myanmar Standard Time","Description":"(UTC+06:30) Yangon (Rangoon)","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-390,"Period":"-PT6H30M"}]}]}', - 'N. Central Asia Standard Time' => '{"Id":"N. Central Asia Standard Time","Description":"(UTC+07:00) Novosibirsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":7,"Week":4,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]}]}', - 'Namibia Standard Time' => '{"Id":"Namibia Standard Time","Description":"(UTC+02:00) Windhoek","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2017-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":9,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1514764800,"Type":"Static","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]}]}', - 'Nepal Standard Time' => '{"Id":"Nepal Standard Time","Description":"(UTC+05:45) Kathmandu","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-345,"Period":"-PT5H45M"}]}]}', - 'New Zealand Standard Time' => '{"Id":"New Zealand Standard Time","Description":"(UTC+12:00) Auckland, Wellington","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":3,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2006-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":3,"Week":3,"Day":"Sunday","Time":"PT3H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":9,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":4,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":9,"Week":-1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Newfoundland Standard Time' => '{"Id":"Newfoundland Standard Time","Description":"(UTC-03:30) Newfoundland","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":150,"Period":"PT2H30M","Month":4,"Week":1,"Day":"Sunday","Time":"PT1M"},{"Id":"2006-Standard","Class":"Standard","Bias":210,"Period":"PT3H30M","Month":10,"Week":-1,"Day":"Sunday","Time":"PT1M"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":150,"Period":"PT2H30M","Month":3,"Week":2,"Day":"Sunday","Time":"PT1M"},{"Id":"2007-Standard","Class":"Standard","Bias":210,"Period":"PT3H30M","Month":11,"Week":1,"Day":"Sunday","Time":"PT1M"}]},{"Id":"2","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":150,"Period":"PT2H30M","Month":3,"Week":2,"Day":"Sunday","Time":"PT1M"},{"Id":"2008-Standard","Class":"Standard","Bias":210,"Period":"PT3H30M","Month":11,"Week":1,"Day":"Sunday","Time":"PT1M"}]},{"Id":"3","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":150,"Period":"PT2H30M","Month":3,"Week":2,"Day":"Sunday","Time":"PT1M"},{"Id":"2009-Standard","Class":"Standard","Bias":210,"Period":"PT3H30M","Month":11,"Week":1,"Day":"Sunday","Time":"PT1M"}]},{"Id":"4","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":150,"Period":"PT2H30M","Month":3,"Week":2,"Day":"Sunday","Time":"PT1M"},{"Id":"2010-Standard","Class":"Standard","Bias":210,"Period":"PT3H30M","Month":11,"Week":1,"Day":"Sunday","Time":"PT1M"}]},{"Id":"5","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":150,"Period":"PT2H30M","Month":3,"Week":2,"Day":"Sunday","Time":"PT1M"},{"Id":"2011-Standard","Class":"Standard","Bias":210,"Period":"PT3H30M","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"6","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":150,"Period":"PT2H30M","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2012-Standard","Class":"Standard","Bias":210,"Period":"PT3H30M","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Norfolk Standard Time' => '{"Id":"Norfolk Standard Time","Description":"(UTC+11:00) Norfolk Island","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":-690,"Period":"-PT11H30M"}]},{"Id":"1","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-690,"Period":"-PT11H30M","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2015-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]},{"Id":"3","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]},{"Id":"4","Effective":1514764800,"Type":"Static","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]},{"Id":"5","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2019-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"6","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":4,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2020-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'North Asia East Standard Time' => '{"Id":"North Asia East Standard Time","Description":"(UTC+08:00) Irkutsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]}]}', - 'North Asia Standard Time' => '{"Id":"North Asia Standard Time","Description":"(UTC+07:00) Krasnoyarsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-480,"Period":"-PT8H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]}]}', - 'North Korea Standard Time' => '{"Id":"North Korea Standard Time","Description":"(UTC+09:00) Pyongyang","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]},{"Id":"1","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2015-Standard","Class":"Standard","Bias":-510,"Period":"-PT8H30M","Month":8,"Week":2,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-510,"Period":"-PT8H30M"}]},{"Id":"3","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-510,"Period":"-PT8H30M"}]},{"Id":"4","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-510,"Period":"-PT8H30M","Month":1,"Week":1,"Day":"Monday","Time":"PT0H"},{"Id":"2018-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H","Month":5,"Week":1,"Day":"Friday","Time":"PT23H30M"}]},{"Id":"5","Effective":1546300800,"Type":"Static","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]}]}', - 'Omsk Standard Time' => '{"Id":"Omsk Standard Time","Description":"(UTC+06:00) Omsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]}]}', - 'Pacific SA Standard Time' => '{"Id":"Pacific SA Standard Time","Description":"(UTC-04:00) Santiago","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2007-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2008-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2009-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2010-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":5,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2011-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":8,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2012-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2013-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2014-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]},{"Id":"9","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":5,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2016-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":8,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":5,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2017-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":8,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":5,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2018-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":8,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2019-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"13","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2020-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"14","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2021-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"15","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2022-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"16","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2023-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]}]}', - 'Pacific Standard Time' => '{"Id":"Pacific Standard Time","Description":"(UTC-08:00) Pacific Time (US & Canada)","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Pacific Standard Time (Mexico)' => '{"Id":"Pacific Standard Time (Mexico)","Description":"(UTC-08:00) Baja California","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2009-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Pakistan Standard Time' => '{"Id":"Pakistan Standard Time","Description":"(UTC+05:00) Islamabad, Karachi","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":5,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2008-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H","Month":10,"Week":-1,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":4,"Week":2,"Day":"Tuesday","Time":"PT23H59M59.999S"},{"Id":"2009-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H"}]}]}', - 'Paraguay Standard Time' => '{"Id":"Paraguay Standard Time","Description":"(UTC-04:00) Asuncion","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2008-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"1","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2009-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2010-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":2,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2011-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2012-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2013-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2014-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2015-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2016-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"9","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2017-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":9,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2018-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":4,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2019-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2020-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"13","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2021-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"14","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT23H59M59.999S"},{"Id":"2022-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"15","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":3,"Week":4,"Day":"Sunday","Time":"PT0H"},{"Id":"2023-Daylight","Class":"Daylight","Bias":180,"Period":"PT3H","Month":10,"Week":1,"Day":"Sunday","Time":"PT0H"}]}]}', - 'Qyzylorda Standard Time' => '{"Id":"Qyzylorda Standard Time","Description":"(UTC+05:00) Qyzylorda","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]},{"Id":"1","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Monday","Time":"PT0H"},{"Id":"2018-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H","Month":12,"Week":3,"Day":"Friday","Time":"PT0H"}]},{"Id":"2","Effective":1546300800,"Type":"Static","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H"}]}]}', - 'Romance Standard Time' => '{"Id":"Romance Standard Time","Description":"(UTC+01:00) Brussels, Copenhagen, Madrid, Paris","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"1-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]}]}', - 'Russia Time Zone 10' => '{"Id":"Russia Time Zone 10","Description":"(UTC+11:00) Chokurdakh","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]}]}', - 'Russia Time Zone 11' => '{"Id":"Russia Time Zone 11","Description":"(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-780,"Period":"-PT13H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2009-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2010-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"2","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-720,"Period":"-PT12H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]}]}', - 'Russia Time Zone 3' => '{"Id":"Russia Time Zone 3","Description":"(UTC+04:00) Izhevsk, Samara","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-300,"Period":"-PT5H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2009-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2010-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"2","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Russian Standard Time' => '{"Id":"Russian Standard Time","Description":"(UTC+03:00) Moscow, St. Petersburg","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'SA Eastern Standard Time' => '{"Id":"SA Eastern Standard Time","Description":"(UTC-03:00) Cayenne, Fortaleza","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]}]}', - 'SA Pacific Standard Time' => '{"Id":"SA Pacific Standard Time","Description":"(UTC-05:00) Bogota, Lima, Quito, Rio Branco","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]}]}', - 'SA Western Standard Time' => '{"Id":"SA Western Standard Time","Description":"(UTC-04:00) Georgetown, La Paz, Manaus, San Juan","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":240,"Period":"PT4H"}]}]}', - 'SE Asia Standard Time' => '{"Id":"SE Asia Standard Time","Description":"(UTC+07:00) Bangkok, Hanoi, Jakarta","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]}]}', - 'Saint Pierre Standard Time' => '{"Id":"Saint Pierre Standard Time","Description":"(UTC-03:00) Saint Pierre and Miquelon","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Sakhalin Standard Time' => '{"Id":"Sakhalin Standard Time","Description":"(UTC+11:00) Sakhalin","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]}]}', - 'Samoa Standard Time' => '{"Id":"Samoa Standard Time","Description":"(UTC+13:00) Samoa","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":660,"Period":"PT11H"}]},{"Id":"1","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":660,"Period":"PT11H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2010-Daylight","Class":"Daylight","Bias":600,"Period":"PT10H","Month":9,"Week":-1,"Day":"Sunday","Time":"PT0H"}]},{"Id":"2","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":660,"Period":"PT11H","Month":4,"Week":1,"Day":"Saturday","Time":"PT4H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":600,"Period":"PT10H","Month":9,"Week":4,"Day":"Saturday","Time":"PT3H"}]},{"Id":"3","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-780,"Period":"-PT13H","Month":4,"Week":1,"Day":"Sunday","Time":"PT4H"},{"Id":"2012-Daylight","Class":"Daylight","Bias":-840,"Period":"-PT14H","Month":9,"Week":-1,"Day":"Sunday","Time":"PT3H"}]}]}', - 'Saratov Standard Time' => '{"Id":"Saratov Standard Time","Description":"(UTC+04:00) Saratov","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":12,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]}]}', - 'Singapore Standard Time' => '{"Id":"Singapore Standard Time","Description":"(UTC+08:00) Kuala Lumpur, Singapore","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]}]}', - 'South Africa Standard Time' => '{"Id":"South Africa Standard Time","Description":"(UTC+02:00) Harare, Pretoria","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]}]}', - 'South Sudan Standard Time' => '{"Id":"South Sudan Standard Time","Description":"(UTC+02:00) Juba","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"1","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2021-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":1,"Week":-1,"Day":"Sunday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1640995200,"Type":"Static","Alterations":[{"Id":"2022-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]}]}', - 'Sri Lanka Standard Time' => '{"Id":"Sri Lanka Standard Time","Description":"(UTC+05:30) Sri Jayawardenepura","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-330,"Period":"-PT5H30M"}]}]}', - 'Sudan Standard Time' => '{"Id":"Sudan Standard Time","Description":"(UTC+02:00) Khartoum","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"1","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2017-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Tuesday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1514764800,"Type":"Static","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H"}]}]}', - 'Syria Standard Time' => '{"Id":"Syria Standard Time","Description":"(UTC+02:00) Damascus","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2004-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2004-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"1","Effective":1104537600,"Type":"Dynamic","Alterations":[{"Id":"2005-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2005-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":-1,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2006-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":3,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2007-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":11,"Week":1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"4","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2008-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"5","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2009-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"6","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2010-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"7","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":4,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"8","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2012-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"9","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2013-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"12","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"13","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2017-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"14","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"15","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2019-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"16","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2020-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"17","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2021-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"18","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2022-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"19","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2023-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"20","Effective":1704067200,"Type":"Dynamic","Alterations":[{"Id":"2024-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2024-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Friday","Time":"PT0H"}]}]}', - 'Taipei Standard Time' => '{"Id":"Taipei Standard Time","Description":"(UTC+08:00) Taipei","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]}]}', - 'Tasmania Standard Time' => '{"Id":"Tasmania Standard Time","Description":"(UTC+10:00) Hobart","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":4,"Week":1,"Day":"Sunday","Time":"PT3H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":10,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'Tocantins Standard Time' => '{"Id":"Tocantins Standard Time","Description":"(UTC-03:00) Araguaina","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]},{"Id":"1","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2012-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":10,"Week":3,"Day":"Sunday","Time":"PT0H"}]},{"Id":"2","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":120,"Period":"PT2H","Month":1,"Week":1,"Day":"Tuesday","Time":"PT0H"},{"Id":"2013-Standard","Class":"Standard","Bias":180,"Period":"PT3H","Month":2,"Week":3,"Day":"Saturday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1388534400,"Type":"Static","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":180,"Period":"PT3H"}]}]}', - 'Tokyo Standard Time' => '{"Id":"Tokyo Standard Time","Description":"(UTC+09:00) Osaka, Sapporo, Tokyo","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]}]}', - 'Tomsk Standard Time' => '{"Id":"Tomsk Standard Time","Description":"(UTC+07:00) Tomsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-420,"Period":"-PT7H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-360,"Period":"-PT6H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-360,"Period":"-PT6H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":5,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]}]}', - 'Tonga Standard Time' => '{"Id":"Tonga Standard Time","Description":"(UTC+13:00) Nuku\'alofa","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-780,"Period":"-PT13H"}]},{"Id":"1","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-780,"Period":"-PT13H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Daylight","Class":"Daylight","Bias":-840,"Period":"-PT14H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-840,"Period":"-PT14H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2017-Standard","Class":"Standard","Bias":-780,"Period":"-PT13H","Month":1,"Week":3,"Day":"Sunday","Time":"PT3H"}]},{"Id":"3","Effective":1514764800,"Type":"Static","Alterations":[{"Id":"2018-Standard","Class":"Standard","Bias":-780,"Period":"-PT13H"}]}]}', - 'Transbaikal Standard Time' => '{"Id":"Transbaikal Standard Time","Description":"(UTC+09:00) Chita","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-480,"Period":"-PT8H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]}]}', - 'Turkey Standard Time' => '{"Id":"Turkey Standard Time","Description":"(UTC+03:00) Istanbul","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2010-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT4H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Monday","Time":"PT3H"},{"Id":"2011-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT4H"}]},{"Id":"2","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2012-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT4H"}]},{"Id":"3","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2013-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT4H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Monday","Time":"PT3H"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT4H"}]},{"Id":"5","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":11,"Week":2,"Day":"Sunday","Time":"PT4H"}]},{"Id":"6","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'Turks And Caicos Standard Time' => '{"Id":"Turks And Caicos Standard Time","Description":"(UTC-05:00) Turks and Caicos","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2014-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2015-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":240,"Period":"PT4H"}]},{"Id":"3","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":240,"Period":"PT4H"}]},{"Id":"4","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2018-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2019-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'US Eastern Standard Time' => '{"Id":"US Eastern Standard Time","Description":"(UTC-05:00) Indiana (East)","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2005-Standard","Class":"Standard","Bias":300,"Period":"PT5H"}]},{"Id":"1","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":300,"Period":"PT5H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]}]}', - 'US Mountain Standard Time' => '{"Id":"US Mountain Standard Time","Description":"(UTC-07:00) Arizona","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":420,"Period":"PT7H"}]}]}', - 'UTC' => '{"Id":"UTC","Description":"(UTC) Coordinated Universal Time","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":0,"Period":"PT0H"}]}]}', - 'UTC+12' => '{"Id":"UTC+12","Description":"(UTC+12:00) Coordinated Universal Time+12","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-720,"Period":"-PT12H"}]}]}', - 'UTC+13' => '{"Id":"UTC+13","Description":"(UTC+13:00) Coordinated Universal Time+13","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-780,"Period":"-PT13H"}]}]}', - 'UTC-02' => '{"Id":"UTC-02","Description":"(UTC-02:00) Coordinated Universal Time-02","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":120,"Period":"PT2H"}]}]}', - 'UTC-08' => '{"Id":"UTC-08","Description":"(UTC-08:00) Coordinated Universal Time-08","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":480,"Period":"PT8H"}]}]}', - 'UTC-09' => '{"Id":"UTC-09","Description":"(UTC-09:00) Coordinated Universal Time-09","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":540,"Period":"PT9H"}]}]}', - 'UTC-11' => '{"Id":"UTC-11","Description":"(UTC-11:00) Coordinated Universal Time-11","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":660,"Period":"PT11H"}]}]}', - 'Ulaanbaatar Standard Time' => '{"Id":"Ulaanbaatar Standard Time","Description":"(UTC+08:00) Ulaanbaatar","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]},{"Id":"1","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT2H"},{"Id":"2015-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":9,"Week":-1,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT2H"},{"Id":"2016-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":9,"Week":4,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]}]}', - 'Venezuela Standard Time' => '{"Id":"Venezuela Standard Time","Description":"(UTC-04:00) Caracas","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":240,"Period":"PT4H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":240,"Period":"PT4H","Month":1,"Week":1,"Day":"Monday","Time":"PT0H"},{"Id":"2007-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M","Month":12,"Week":2,"Day":"Sunday","Time":"PT3H"}]},{"Id":"2","Effective":1199145600,"Type":"Static","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"3","Effective":1230768000,"Type":"Static","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"4","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"5","Effective":1293840000,"Type":"Static","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"6","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"7","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"8","Effective":1388534400,"Type":"Static","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"9","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":270,"Period":"PT4H30M"}]},{"Id":"10","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":270,"Period":"PT4H30M","Month":1,"Week":1,"Day":"Friday","Time":"PT0H"},{"Id":"2016-Standard","Class":"Standard","Bias":240,"Period":"PT4H","Month":5,"Week":1,"Day":"Sunday","Time":"PT2H30M"}]},{"Id":"11","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":240,"Period":"PT4H"}]}]}', - 'Vladivostok Standard Time' => '{"Id":"Vladivostok Standard Time","Description":"(UTC+10:00) Vladivostok","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-660,"Period":"-PT11H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-660,"Period":"-PT11H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]}]}', - 'Volgograd Standard Time' => '{"Id":"Volgograd Standard Time","Description":"(UTC+03:00) Volgograd","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-240,"Period":"-PT4H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"6","Effective":1451606400,"Type":"Static","Alterations":[{"Id":"2016-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"7","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]},{"Id":"8","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":1,"Week":1,"Day":"Monday","Time":"PT0H"},{"Id":"2018-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"9","Effective":1546300800,"Type":"Static","Alterations":[{"Id":"2019-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H"}]},{"Id":"10","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":-300,"Period":"-PT5H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2020-Standard","Class":"Standard","Bias":-240,"Period":"-PT4H","Month":12,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"11","Effective":1609459200,"Type":"Static","Alterations":[{"Id":"2021-Standard","Class":"Standard","Bias":-180,"Period":"-PT3H"}]}]}', - 'W. Australia Standard Time' => '{"Id":"W. Australia Standard Time","Description":"(UTC+08:00) Perth","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"2005-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]},{"Id":"1","Effective":1136073600,"Type":"Dynamic","Alterations":[{"Id":"2006-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":1,"Week":1,"Day":"Sunday","Time":"PT0H"},{"Id":"2006-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":12,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2007-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"},{"Id":"2008-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"4","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":-540,"Period":"-PT9H","Month":1,"Week":1,"Day":"Thursday","Time":"PT0H"},{"Id":"2009-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"5","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":-480,"Period":"-PT8H"}]}]}', - 'W. Central Africa Standard Time' => '{"Id":"W. Central Africa Standard Time","Description":"(UTC+01:00) West Central Africa","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H"}]}]}', - 'W. Europe Standard Time' => '{"Id":"W. Europe Standard Time","Description":"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"1-Daylight","Class":"Daylight","Bias":-120,"Period":"-PT2H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"1-Standard","Class":"Standard","Bias":-60,"Period":"-PT1H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]}]}', - 'W. Mongolia Standard Time' => '{"Id":"W. Mongolia Standard Time","Description":"(UTC+07:00) Hovd","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":9,"Week":-1,"Day":"Saturday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Static","Alterations":[{"Id":"2007-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"2","Effective":1199145600,"Type":"Static","Alterations":[{"Id":"2008-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"3","Effective":1230768000,"Type":"Static","Alterations":[{"Id":"2009-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"4","Effective":1262304000,"Type":"Static","Alterations":[{"Id":"2010-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"5","Effective":1293840000,"Type":"Static","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"6","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"7","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"8","Effective":1388534400,"Type":"Static","Alterations":[{"Id":"2014-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]},{"Id":"9","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT2H"},{"Id":"2015-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":9,"Week":-1,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"10","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-480,"Period":"-PT8H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT2H"},{"Id":"2016-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H","Month":9,"Week":4,"Day":"Friday","Time":"PT23H59M59.999S"}]},{"Id":"11","Effective":1483228800,"Type":"Static","Alterations":[{"Id":"2017-Standard","Class":"Standard","Bias":-420,"Period":"-PT7H"}]}]}', - 'West Asia Standard Time' => '{"Id":"West Asia Standard Time","Description":"(UTC+05:00) Ashgabat, Toshkent","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-300,"Period":"-PT5H"}]}]}', - 'West Bank Standard Time' => '{"Id":"West Bank Standard Time","Description":"(UTC+02:00) Gaza, Hebron","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2012-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":3,"Day":"Friday","Time":"PT1H"}]},{"Id":"1","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2013-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":9,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"2","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Thursday","Time":"PT23H59M59.999S"},{"Id":"2014-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Thursday","Time":"PT23H59M59.999S"}]},{"Id":"3","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2015-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Friday","Time":"PT1H"}]},{"Id":"4","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT1H"},{"Id":"2016-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"5","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT1H"},{"Id":"2017-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"6","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Saturday","Time":"PT1H"},{"Id":"2018-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"7","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Friday","Time":"PT0H"},{"Id":"2019-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Saturday","Time":"PT0H"}]},{"Id":"8","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Saturday","Time":"PT0H"},{"Id":"2020-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Saturday","Time":"PT1H"}]},{"Id":"9","Effective":1609459200,"Type":"Dynamic","Alterations":[{"Id":"2021-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2021-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"10","Effective":1640995200,"Type":"Dynamic","Alterations":[{"Id":"2022-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2022-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"11","Effective":1672531200,"Type":"Dynamic","Alterations":[{"Id":"2023-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2023-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"12","Effective":1704067200,"Type":"Dynamic","Alterations":[{"Id":"2024-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2024-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"13","Effective":1735689600,"Type":"Dynamic","Alterations":[{"Id":"2025-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2025-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"14","Effective":1767225600,"Type":"Dynamic","Alterations":[{"Id":"2026-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2026-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":4,"Day":"Saturday","Time":"PT1H"}]},{"Id":"15","Effective":1798761600,"Type":"Dynamic","Alterations":[{"Id":"2027-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2027-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"16","Effective":1830297600,"Type":"Dynamic","Alterations":[{"Id":"2028-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2028-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"17","Effective":1861920000,"Type":"Dynamic","Alterations":[{"Id":"2029-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":4,"Day":"Saturday","Time":"PT0H"},{"Id":"2029-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]},{"Id":"18","Effective":1893456000,"Type":"Dynamic","Alterations":[{"Id":"2030-Daylight","Class":"Daylight","Bias":-180,"Period":"-PT3H","Month":3,"Week":-1,"Day":"Saturday","Time":"PT0H"},{"Id":"2030-Standard","Class":"Standard","Bias":-120,"Period":"-PT2H","Month":10,"Week":-1,"Day":"Saturday","Time":"PT1H"}]}]}', - 'West Pacific Standard Time' => '{"Id":"West Pacific Standard Time","Description":"(UTC+10:00) Guam, Port Moresby","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Static","Alterations":[{"Id":"1-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]}]}', - 'Yakutsk Standard Time' => '{"Id":"Yakutsk Standard Time","Description":"(UTC+09:00) Yakutsk","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT3H"}]},{"Id":"1","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H","Month":1,"Week":1,"Day":"Saturday","Time":"PT0H"},{"Id":"2011-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":3,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1325376000,"Type":"Static","Alterations":[{"Id":"2012-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]},{"Id":"3","Effective":1356998400,"Type":"Static","Alterations":[{"Id":"2013-Standard","Class":"Standard","Bias":-600,"Period":"-PT10H"}]},{"Id":"4","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":-600,"Period":"-PT10H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2014-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1420070400,"Type":"Static","Alterations":[{"Id":"2015-Standard","Class":"Standard","Bias":-540,"Period":"-PT9H"}]}]}', - 'Yukon Standard Time' => '{"Id":"Yukon Standard Time","Description":"(UTC-07:00) Yukon","Mutations":[{"Id":"0","Effective":-2147483648,"Type":"Dynamic","Alterations":[{"Id":"2006-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":4,"Week":1,"Day":"Sunday","Time":"PT2H"},{"Id":"2006-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":10,"Week":-1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"1","Effective":1167609600,"Type":"Dynamic","Alterations":[{"Id":"2007-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2007-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"2","Effective":1199145600,"Type":"Dynamic","Alterations":[{"Id":"2008-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2008-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"3","Effective":1230768000,"Type":"Dynamic","Alterations":[{"Id":"2009-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2009-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"4","Effective":1262304000,"Type":"Dynamic","Alterations":[{"Id":"2010-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2010-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"5","Effective":1293840000,"Type":"Dynamic","Alterations":[{"Id":"2011-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2011-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"6","Effective":1325376000,"Type":"Dynamic","Alterations":[{"Id":"2012-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2012-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"7","Effective":1356998400,"Type":"Dynamic","Alterations":[{"Id":"2013-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2013-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"8","Effective":1388534400,"Type":"Dynamic","Alterations":[{"Id":"2014-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2014-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"9","Effective":1420070400,"Type":"Dynamic","Alterations":[{"Id":"2015-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2015-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"10","Effective":1451606400,"Type":"Dynamic","Alterations":[{"Id":"2016-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2016-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"11","Effective":1483228800,"Type":"Dynamic","Alterations":[{"Id":"2017-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2017-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"12","Effective":1514764800,"Type":"Dynamic","Alterations":[{"Id":"2018-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2018-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"13","Effective":1546300800,"Type":"Dynamic","Alterations":[{"Id":"2019-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"},{"Id":"2019-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":11,"Week":1,"Day":"Sunday","Time":"PT2H"}]},{"Id":"14","Effective":1577836800,"Type":"Dynamic","Alterations":[{"Id":"2020-Standard","Class":"Standard","Bias":480,"Period":"PT8H","Month":1,"Week":1,"Day":"Wednesday","Time":"PT0H"},{"Id":"2020-Daylight","Class":"Daylight","Bias":420,"Period":"PT7H","Month":3,"Week":2,"Day":"Sunday","Time":"PT2H"}]},{"Id":"15","Effective":1609459200,"Type":"Static","Alterations":[{"Id":"2021-Standard","Class":"Standard","Bias":420,"Period":"PT7H"}]}]}', - ]; - - /** - * conversion table of IANA time zones to EAS (Microsoft/Windows) time zones - * @var array $eastoiana - */ - private static $ianatoeas = [ - 'Africa/Abidjan' => 'Greenwich Standard Time', - 'Africa/Accra' => 'Greenwich Standard Time', - 'Africa/Addis_Ababa' => 'E. Africa Standard Time', - 'Africa/Algiers' => 'W. Central Africa Standard Time', - 'Africa/Asmera' => 'E. Africa Standard Time', - 'Africa/Bamako' => 'Greenwich Standard Time', - 'Africa/Bangui' => 'W. Central Africa Standard Time', - 'Africa/Banjul' => 'Greenwich Standard Time', - 'Africa/Bissau' => 'Greenwich Standard Time', - 'Africa/Blantyre' => 'South Africa Standard Time', - 'Africa/Brazzaville' => 'W. Central Africa Standard Time', - 'Africa/Bujumbura' => 'South Africa Standard Time', - 'Africa/Cairo' => 'Egypt Standard Time', - 'Africa/Casablanca' => 'Morocco Standard Time', - 'Africa/Ceuta' => 'Romance Standard Time', - 'Africa/Conakry' => 'Greenwich Standard Time', - 'Africa/Dakar' => 'Greenwich Standard Time', - 'Africa/Dar_es_Salaam' => 'E. Africa Standard Time', - 'Africa/Djibouti' => 'E. Africa Standard Time', - 'Africa/Douala' => 'W. Central Africa Standard Time', - 'Africa/El_Aaiun' => 'Morocco Standard Time', - 'Africa/Freetown' => 'Greenwich Standard Time', - 'Africa/Gaborone' => 'South Africa Standard Time', - 'Africa/Harare' => 'South Africa Standard Time', - 'Africa/Johannesburg' => 'South Africa Standard Time', - 'Africa/Juba' => 'South Sudan Standard Time', - 'Africa/Kampala' => 'E. Africa Standard Time', - 'Africa/Khartoum' => 'Sudan Standard Time', - 'Africa/Kigali' => 'South Africa Standard Time', - 'Africa/Kinshasa' => 'W. Central Africa Standard Time', - 'Africa/Lagos' => 'W. Central Africa Standard Time', - 'Africa/Libreville' => 'W. Central Africa Standard Time', - 'Africa/Lome' => 'Greenwich Standard Time', - 'Africa/Luanda' => 'W. Central Africa Standard Time', - 'Africa/Lubumbashi' => 'South Africa Standard Time', - 'Africa/Lusaka' => 'South Africa Standard Time', - 'Africa/Malabo' => 'W. Central Africa Standard Time', - 'Africa/Maputo' => 'South Africa Standard Time', - 'Africa/Maseru' => 'South Africa Standard Time', - 'Africa/Mbabane' => 'South Africa Standard Time', - 'Africa/Mogadishu' => 'E. Africa Standard Time', - 'Africa/Monrovia' => 'Greenwich Standard Time', - 'Africa/Nairobi' => 'E. Africa Standard Time', - 'Africa/Ndjamena' => 'W. Central Africa Standard Time', - 'Africa/Niamey' => 'W. Central Africa Standard Time', - 'Africa/Nouakchott' => 'Greenwich Standard Time', - 'Africa/Ouagadougou' => 'Greenwich Standard Time', - 'Africa/Porto-Novo' => 'W. Central Africa Standard Time', - 'Africa/Sao_Tome' => 'Sao Tome Standard Time', - 'Africa/Tripoli' => 'Libya Standard Time', - 'Africa/Tunis' => 'W. Central Africa Standard Time', - 'Africa/Windhoek' => 'Namibia Standard Time', - 'America/Adak' => 'Aleutian Standard Time', - 'America/Anchorage' => 'Alaskan Standard Time', - 'America/Anguilla' => 'SA Western Standard Time', - 'America/Antigua' => 'SA Western Standard Time', - 'America/Araguaina' => 'Tocantins Standard Time', - 'America/Argentina/La_Rioja' => 'Argentina Standard Time', - 'America/Argentina/Rio_Gallegos' => 'Argentina Standard Time', - 'America/Argentina/Salta' => 'Argentina Standard Time', - 'America/Argentina/San_Juan' => 'Argentina Standard Time', - 'America/Argentina/San_Luis' => 'Argentina Standard Time', - 'America/Argentina/Tucuman' => 'Argentina Standard Time', - 'America/Argentina/Ushuaia' => 'Argentina Standard Time', - 'America/Aruba' => 'SA Western Standard Time', - 'America/Asuncion' => 'Paraguay Standard Time', - 'America/Bahia' => 'Bahia Standard Time', - 'America/Bahia_Banderas' => 'Central Standard Time (Mexico)', - 'America/Barbados' => 'SA Western Standard Time', - 'America/Belem' => 'SA Eastern Standard Time', - 'America/Belize' => 'Central America Standard Time', - 'America/Blanc-Sablon' => 'SA Western Standard Time', - 'America/Boa_Vista' => 'SA Western Standard Time', - 'America/Bogota' => 'SA Pacific Standard Time', - 'America/Boise' => 'Mountain Standard Time', - 'America/Buenos_Aires' => 'Argentina Standard Time', - 'America/Cambridge_Bay' => 'Mountain Standard Time', - 'America/Campo_Grande' => 'Central Brazilian Standard Time', - 'America/Cancun' => 'Eastern Standard Time (Mexico)', - 'America/Caracas' => 'Venezuela Standard Time', - 'America/Catamarca' => 'Argentina Standard Time', - 'America/Cayenne' => 'SA Eastern Standard Time', - 'America/Cayman' => 'SA Pacific Standard Time', - 'America/Chicago' => 'Central Standard Time', - 'America/Chihuahua' => 'Mountain Standard Time (Mexico)', - 'America/Coral_Harbour' => 'SA Pacific Standard Time', - 'America/Cordoba' => 'Argentina Standard Time', - 'America/Costa_Rica' => 'Central America Standard Time', - 'America/Creston' => 'US Mountain Standard Time', - 'America/Cuiaba' => 'Central Brazilian Standard Time', - 'America/Curacao' => 'SA Western Standard Time', - 'America/Danmarkshavn' => 'GMT Standard Time', - 'America/Dawson' => 'Pacific Standard Time', - 'America/Dawson_Creek' => 'US Mountain Standard Time', - 'America/Denver' => 'Mountain Standard Time', - 'America/Detroit' => 'Eastern Standard Time', - 'America/Dominica' => 'SA Western Standard Time', - 'America/Edmonton' => 'Mountain Standard Time', - 'America/Eirunepe' => 'SA Pacific Standard Time', - 'America/El_Salvador' => 'Central America Standard Time', - 'America/Fort_Nelson' => 'US Mountain Standard Time', - 'America/Fortaleza' => 'SA Eastern Standard Time', - 'America/Glace_Bay' => 'Atlantic Standard Time', - 'America/Godthab' => 'Greenland Standard Time', - 'America/Goose_Bay' => 'Atlantic Standard Time', - 'America/Grand_Turk' => 'Turks And Caicos Standard Time', - 'America/Grenada' => 'SA Western Standard Time', - 'America/Guadeloupe' => 'SA Western Standard Time', - 'America/Guatemala' => 'Central America Standard Time', - 'America/Guayaquil' => 'SA Pacific Standard Time', - 'America/Guyana' => 'SA Western Standard Time', - 'America/Halifax' => 'Atlantic Standard Time', - 'America/Havana' => 'Cuba Standard Time', - 'America/Hermosillo' => 'US Mountain Standard Time', - 'America/Indiana/Knox' => 'Central Standard Time', - 'America/Indiana/Marengo' => 'US Eastern Standard Time', - 'America/Indiana/Petersburg' => 'Eastern Standard Time', - 'America/Indiana/Tell_City' => 'Central Standard Time', - 'America/Indiana/Vevay' => 'US Eastern Standard Time', - 'America/Indiana/Vincennes' => 'Eastern Standard Time', - 'America/Indiana/Winamac' => 'Eastern Standard Time', - 'America/Indianapolis' => 'US Eastern Standard Time', - 'America/Inuvik' => 'Mountain Standard Time', - 'America/Iqaluit' => 'Eastern Standard Time', - 'America/Jamaica' => 'SA Pacific Standard Time', - 'America/Jujuy' => 'Argentina Standard Time', - 'America/Juneau' => 'Alaskan Standard Time', - 'America/Kentucky/Monticello' => 'Eastern Standard Time', - 'America/Kralendijk' => 'SA Western Standard Time', - 'America/La_Paz' => 'SA Western Standard Time', - 'America/Lima' => 'SA Pacific Standard Time', - 'America/Los_Angeles' => 'Pacific Standard Time', - 'America/Louisville' => 'Eastern Standard Time', - 'America/Lower_Princes' => 'SA Western Standard Time', - 'America/Maceio' => 'SA Eastern Standard Time', - 'America/Managua' => 'Central America Standard Time', - 'America/Manaus' => 'SA Western Standard Time', - 'America/Marigot' => 'SA Western Standard Time', - 'America/Martinique' => 'SA Western Standard Time', - 'America/Matamoros' => 'Central Standard Time', - 'America/Mazatlan' => 'Mountain Standard Time (Mexico)', - 'America/Mendoza' => 'Argentina Standard Time', - 'America/Menominee' => 'Central Standard Time', - 'America/Merida' => 'Central Standard Time (Mexico)', - 'America/Metlakatla' => 'Alaskan Standard Time', - 'America/Mexico_City' => 'Central Standard Time (Mexico)', - 'America/Miquelon' => 'Saint Pierre Standard Time', - 'America/Moncton' => 'Atlantic Standard Time', - 'America/Monterrey' => 'Central Standard Time (Mexico)', - 'America/Montevideo' => 'Montevideo Standard Time', - 'America/Montreal' => 'Eastern Standard Time', - 'America/Montserrat' => 'SA Western Standard Time', - 'America/Nassau' => 'Eastern Standard Time', - 'America/New_York' => 'Eastern Standard Time', - 'America/Nipigon' => 'Eastern Standard Time', - 'America/Nome' => 'Alaskan Standard Time', - 'America/Noronha' => 'Mid-Atlantic Standard Time', - 'America/North_Dakota/Beulah' => 'Central Standard Time', - 'America/North_Dakota/Center' => 'Central Standard Time', - 'America/North_Dakota/New_Salem' => 'Central Standard Time', - 'America/Ojinaga' => 'Mountain Standard Time', - 'America/Panama' => 'SA Pacific Standard Time', - 'America/Pangnirtung' => 'Eastern Standard Time', - 'America/Paramaribo' => 'SA Eastern Standard Time', - 'America/Phoenix' => 'US Mountain Standard Time', - 'America/Port_of_Spain' => 'SA Western Standard Time', - 'America/Port-au-Prince' => 'Haiti Standard Time', - 'America/Porto_Velho' => 'SA Western Standard Time', - 'America/Puerto_Rico' => 'SA Western Standard Time', - 'America/Punta_Arenas' => 'Magallanes Standard Time', - 'America/Rainy_River' => 'Central Standard Time', - 'America/Rankin_Inlet' => 'Central Standard Time', - 'America/Recife' => 'SA Eastern Standard Time', - 'America/Regina' => 'Canada Central Standard Time', - 'America/Resolute' => 'Central Standard Time', - 'America/Rio_Branco' => 'SA Pacific Standard Time', - 'America/Santa_Isabel' => 'Pacific Standard Time (Mexico)', - 'America/Santarem' => 'SA Eastern Standard Time', - 'America/Santiago' => 'Pacific SA Standard Time', - 'America/Santo_Domingo' => 'SA Western Standard Time', - 'America/Sao_Paulo' => 'E. South America Standard Time', - 'America/Scoresbysund' => 'Azores Standard Time', - 'America/Sitka' => 'Alaskan Standard Time', - 'America/St_Barthelemy' => 'SA Western Standard Time', - 'America/St_Johns' => 'Newfoundland Standard Time', - 'America/St_Kitts' => 'SA Western Standard Time', - 'America/St_Lucia' => 'SA Western Standard Time', - 'America/St_Thomas' => 'SA Western Standard Time', - 'America/St_Vincent' => 'SA Western Standard Time', - 'America/Swift_Current' => 'Canada Central Standard Time', - 'America/Tegucigalpa' => 'Central America Standard Time', - 'America/Thule' => 'Atlantic Standard Time', - 'America/Thunder_Bay' => 'Eastern Standard Time', - 'America/Tijuana' => 'Pacific Standard Time (Mexico)', - 'America/Toronto' => 'Eastern Standard Time', - 'America/Tortola' => 'SA Western Standard Time', - 'America/Vancouver' => 'Pacific Standard Time', - 'America/Whitehorse' => 'Pacific Standard Time', - 'America/Winnipeg' => 'Central Standard Time', - 'America/Yakutat' => 'Alaskan Standard Time', - 'America/Yellowknife' => 'Mountain Standard Time', - 'Antarctica/Casey' => 'Singapore Standard Time', - 'Antarctica/Davis' => 'SE Asia Standard Time', - 'Antarctica/DumontDUrville' => 'West Pacific Standard Time', - 'Antarctica/Macquarie' => 'Central Pacific Standard Time', - 'Antarctica/Mawson' => 'West Asia Standard Time', - 'Antarctica/McMurdo' => 'New Zealand Standard Time', - 'Antarctica/Palmer' => 'SA Eastern Standard Time', - 'Antarctica/Rothera' => 'SA Eastern Standard Time', - 'Antarctica/Syowa' => 'E. Africa Standard Time', - 'Antarctica/Vostok' => 'Central Asia Standard Time', - 'Arctic/Longyearbyen' => 'W. Europe Standard Time', - 'Asia/Aden' => 'Arab Standard Time', - 'Asia/Almaty' => 'Central Asia Standard Time', - 'Asia/Amman' => 'Jordan Standard Time', - 'Asia/Anadyr' => 'Kamchatka Standard Time', - 'Asia/Aqtau' => 'West Asia Standard Time', - 'Asia/Aqtobe' => 'West Asia Standard Time', - 'Asia/Ashgabat' => 'West Asia Standard Time', - 'Asia/Atyrau' => 'West Asia Standard Time', - 'Asia/Baghdad' => 'Arabic Standard Time', - 'Asia/Bahrain' => 'Arab Standard Time', - 'Asia/Baku' => 'Azerbaijan Standard Time', - 'Asia/Bangkok' => 'SE Asia Standard Time', - 'Asia/Barnaul' => 'Altai Standard Time', - 'Asia/Beirut' => 'Middle East Standard Time', - 'Asia/Bishkek' => 'Central Asia Standard Time', - 'Asia/Brunei' => 'Singapore Standard Time', - 'Asia/Calcutta' => 'India Standard Time', - 'Asia/Chita' => 'Transbaikal Standard Time', - 'Asia/Choibalsan' => 'Ulaanbaatar Standard Time', - 'Asia/Colombo' => 'Sri Lanka Standard Time', - 'Asia/Damascus' => 'Syria Standard Time', - 'Asia/Dhaka' => 'Bangladesh Standard Time', - 'Asia/Dili' => 'Tokyo Standard Time', - 'Asia/Dubai' => 'Arabian Standard Time', - 'Asia/Dushanbe' => 'West Asia Standard Time', - 'Asia/Famagusta' => 'GTB Standard Time', - 'Asia/Gaza' => 'West Bank Standard Time', - 'Asia/Hebron' => 'West Bank Standard Time', - 'Asia/Hong_Kong' => 'China Standard Time', - 'Asia/Hovd' => 'W. Mongolia Standard Time', - 'Asia/Irkutsk' => 'North Asia East Standard Time', - 'Asia/Jakarta' => 'SE Asia Standard Time', - 'Asia/Jayapura' => 'Tokyo Standard Time', - 'Asia/Jerusalem' => 'Israel Standard Time', - 'Asia/Kabul' => 'Afghanistan Standard Time', - 'Asia/Kamchatka' => 'Kamchatka Standard Time', - 'Asia/Karachi' => 'Pakistan Standard Time', - 'Asia/Katmandu' => 'Nepal Standard Time', - 'Asia/Khandyga' => 'Yakutsk Standard Time', - 'Asia/Krasnoyarsk' => 'North Asia Standard Time', - 'Asia/Kuala_Lumpur' => 'Malaysia Standard Time', - 'Asia/Kuching' => 'Malaysia Standard Time', - 'Asia/Kuwait' => 'Arab Standard Time', - 'Asia/Macau' => 'China Standard Time', - 'Asia/Magadan' => 'Magadan Standard Time', - 'Asia/Makassar' => 'Singapore Standard Time', - 'Asia/Manila' => 'Singapore Standard Time', - 'Asia/Muscat' => 'Arabian Standard Time', - 'Asia/Nicosia' => 'GTB Standard Time', - 'Asia/Novokuznetsk' => 'North Asia Standard Time', - 'Asia/Novosibirsk' => 'N. Central Asia Standard Time', - 'Asia/Omsk' => 'Omsk Standard Time', - 'Asia/Oral' => 'West Asia Standard Time', - 'Asia/Phnom_Penh' => 'SE Asia Standard Time', - 'Asia/Pontianak' => 'SE Asia Standard Time', - 'Asia/Pyongyang' => 'North Korea Standard Time', - 'Asia/Qatar' => 'Arab Standard Time', - 'Asia/Qostanay' => 'Central Asia Standard Time', - 'Asia/Qyzylorda' => 'Qyzylorda Standard Time', - 'Asia/Rangoon' => 'Myanmar Standard Time', - 'Asia/Riyadh' => 'Arab Standard Time', - 'Asia/Saigon' => 'SE Asia Standard Time', - 'Asia/Sakhalin' => 'Sakhalin Standard Time', - 'Asia/Samarkand' => 'West Asia Standard Time', - 'Asia/Seoul' => 'Korea Standard Time', - 'Asia/Shanghai' => 'China Standard Time', - 'Asia/Singapore' => 'Singapore Standard Time', - 'Asia/Srednekolymsk' => 'Russia Time Zone 10', - 'Asia/Taipei' => 'Taipei Standard Time', - 'Asia/Tashkent' => 'West Asia Standard Time', - 'Asia/Tbilisi' => 'Georgian Standard Time', - 'Asia/Tehran' => 'Iran Standard Time', - 'Asia/Thimphu' => 'Bangladesh Standard Time', - 'Asia/Tokyo' => 'Tokyo Standard Time', - 'Asia/Tomsk' => 'Tomsk Standard Time', - 'Asia/Ulaanbaatar' => 'Ulaanbaatar Standard Time', - 'Asia/Urumqi' => 'Central Asia Standard Time', - 'Asia/Ust-Nera' => 'Vladivostok Standard Time', - 'Asia/Vientiane' => 'SE Asia Standard Time', - 'Asia/Vladivostok' => 'Vladivostok Standard Time', - 'Asia/Yakutsk' => 'Yakutsk Standard Time', - 'Asia/Yekaterinburg' => 'Ekaterinburg Standard Time', - 'Asia/Yerevan' => 'Caucasus Standard Time', - 'Atlantic/Azores' => 'Azores Standard Time', - 'Atlantic/Bermuda' => 'Atlantic Standard Time', - 'Atlantic/Canary' => 'GMT Standard Time', - 'Atlantic/Cape_Verde' => 'Cape Verde Standard Time', - 'Atlantic/Faeroe' => 'GMT Standard Time', - 'Atlantic/Madeira' => 'GMT Standard Time', - 'Atlantic/Reykjavik' => 'Greenwich Standard Time', - 'Atlantic/South_Georgia' => 'Mid-Atlantic Standard Time', - 'Atlantic/St_Helena' => 'Greenwich Standard Time', - 'Atlantic/Stanley' => 'SA Eastern Standard Time', - 'Australia/Adelaide' => 'Cen. Australia Standard Time', - 'Australia/Brisbane' => 'E. Australia Standard Time', - 'Australia/Broken_Hill' => 'Cen. Australia Standard Time', - 'Australia/Currie' => 'Tasmania Standard Time', - 'Australia/Darwin' => 'AUS Central Standard Time', - 'Australia/Eucla' => 'Aus Central W. Standard Time', - 'Australia/Hobart' => 'Tasmania Standard Time', - 'Australia/Lindeman' => 'E. Australia Standard Time', - 'Australia/Lord_Howe' => 'Lord Howe Standard Time', - 'Australia/Melbourne' => 'AUS Eastern Standard Time', - 'Australia/Perth' => 'W. Australia Standard Time', - 'Australia/Sydney' => 'AUS Eastern Standard Time', - 'Europe/Amsterdam' => 'W. Europe Standard Time', - 'Europe/Andorra' => 'W. Europe Standard Time', - 'Europe/Astrakhan' => 'Astrakhan Standard Time', - 'Europe/Athens' => 'GTB Standard Time', - 'Europe/Belgrade' => 'Central Europe Standard Time', - 'Europe/Berlin' => 'W. Europe Standard Time', - 'Europe/Bratislava' => 'Central Europe Standard Time', - 'Europe/Brussels' => 'Romance Standard Time', - 'Europe/Bucharest' => 'GTB Standard Time', - 'Europe/Budapest' => 'Central Europe Standard Time', - 'Europe/Busingen' => 'W. Europe Standard Time', - 'Europe/Chisinau' => 'E. Europe Standard Time', - 'Europe/Copenhagen' => 'Romance Standard Time', - 'Europe/Dublin' => 'GMT Standard Time', - 'Europe/Gibraltar' => 'W. Europe Standard Time', - 'Europe/Guernsey' => 'GMT Standard Time', - 'Europe/Helsinki' => 'FLE Standard Time', - 'Europe/Isle_of_Man' => 'GMT Standard Time', - 'Europe/Istanbul' => 'Turkey Standard Time', - 'Europe/Jersey' => 'GMT Standard Time', - 'Europe/Kaliningrad' => 'Kaliningrad Standard Time', - 'Europe/Kiev' => 'FLE Standard Time', - 'Europe/Kirov' => 'Russian Standard Time', - 'Europe/Lisbon' => 'GMT Standard Time', - 'Europe/Ljubljana' => 'Central Europe Standard Time', - 'Europe/London' => 'GMT Standard Time', - 'Europe/Luxembourg' => 'W. Europe Standard Time', - 'Europe/Madrid' => 'Romance Standard Time', - 'Europe/Malta' => 'W. Europe Standard Time', - 'Europe/Mariehamn' => 'FLE Standard Time', - 'Europe/Minsk' => 'Belarus Standard Time', - 'Europe/Monaco' => 'W. Europe Standard Time', - 'Europe/Moscow' => 'Russian Standard Time', - 'Europe/Oslo' => 'W. Europe Standard Time', - 'Europe/Paris' => 'Romance Standard Time', - 'Europe/Podgorica' => 'Central Europe Standard Time', - 'Europe/Prague' => 'Central Europe Standard Time', - 'Europe/Riga' => 'FLE Standard Time', - 'Europe/Rome' => 'W. Europe Standard Time', - 'Europe/Samara' => 'Russia Time Zone 3', - 'Europe/San_Marino' => 'W. Europe Standard Time', - 'Europe/Sarajevo' => 'Central European Standard Time', - 'Europe/Saratov' => 'Saratov Standard Time', - 'Europe/Simferopol' => 'Russian Standard Time', - 'Europe/Skopje' => 'Central European Standard Time', - 'Europe/Sofia' => 'FLE Standard Time', - 'Europe/Stockholm' => 'W. Europe Standard Time', - 'Europe/Tallinn' => 'FLE Standard Time', - 'Europe/Tirane' => 'Central Europe Standard Time', - 'Europe/Ulyanovsk' => 'Astrakhan Standard Time', - 'Europe/Uzhgorod' => 'FLE Standard Time', - 'Europe/Vaduz' => 'W. Europe Standard Time', - 'Europe/Vatican' => 'W. Europe Standard Time', - 'Europe/Vienna' => 'W. Europe Standard Time', - 'Europe/Vilnius' => 'FLE Standard Time', - 'Europe/Volgograd' => 'Volgograd Standard Time', - 'Europe/Warsaw' => 'Central European Standard Time', - 'Europe/Zagreb' => 'Central European Standard Time', - 'Europe/Zaporozhye' => 'FLE Standard Time', - 'Europe/Zurich' => 'W. Europe Standard Time', - 'Indian/Antananarivo' => 'E. Africa Standard Time', - 'Indian/Chagos' => 'Central Asia Standard Time', - 'Indian/Christmas' => 'SE Asia Standard Time', - 'Indian/Cocos' => 'Myanmar Standard Time', - 'Indian/Comoro' => 'E. Africa Standard Time', - 'Indian/Kerguelen' => 'West Asia Standard Time', - 'Indian/Mahe' => 'Mauritius Standard Time', - 'Indian/Maldives' => 'West Asia Standard Time', - 'Indian/Mauritius' => 'Mauritius Standard Time', - 'Indian/Mayotte' => 'E. Africa Standard Time', - 'Indian/Reunion' => 'Mauritius Standard Time', - 'Pacific/Apia' => 'Samoa Standard Time', - 'Pacific/Auckland' => 'New Zealand Standard Time', - 'Pacific/Bougainville' => 'Bougainville Standard Time', - 'Pacific/Chatham' => 'Chatham Islands Standard Time', - 'Pacific/Easter' => 'Easter Island Standard Time', - 'Pacific/Efate' => 'Central Pacific Standard Time', - 'Pacific/Enderbury' => 'UTC+13', - 'Pacific/Fakaofo' => 'UTC+13', - 'Pacific/Fiji' => 'Fiji Standard Time', - 'Pacific/Funafuti' => 'UTC+12', - 'Pacific/Galapagos' => 'Central America Standard Time', - 'Pacific/Gambier' => 'UTC-09', - 'Pacific/Guadalcanal' => 'Central Pacific Standard Time', - 'Pacific/Guam' => 'West Pacific Standard Time', - 'Pacific/Honolulu' => 'Hawaiian Standard Time', - 'Pacific/Johnston' => 'Hawaiian Standard Time', - 'Pacific/Kiritimati' => 'Line Islands Standard Time', - 'Pacific/Kosrae' => 'Central Pacific Standard Time', - 'Pacific/Kwajalein' => 'UTC+12', - 'Pacific/Majuro' => 'UTC+12', - 'Pacific/Marquesas' => 'Marquesas Standard Time', - 'Pacific/Midway' => 'UTC-11', - 'Pacific/Nauru' => 'UTC+12', - 'Pacific/Niue' => 'UTC-11', - 'Pacific/Norfolk' => 'Norfolk Standard Time', - 'Pacific/Noumea' => 'Central Pacific Standard Time', - 'Pacific/Pago_Pago' => 'UTC-11', - 'Pacific/Palau' => 'Tokyo Standard Time', - 'Pacific/Pitcairn' => 'UTC-08', - 'Pacific/Ponape' => 'Central Pacific Standard Time', - 'Pacific/Port_Moresby' => 'West Pacific Standard Time', - 'Pacific/Rarotonga' => 'Hawaiian Standard Time', - 'Pacific/Saipan' => 'West Pacific Standard Time', - 'Pacific/Tahiti' => 'Hawaiian Standard Time', - 'Pacific/Tarawa' => 'UTC+12', - 'Pacific/Tongatapu' => 'Tonga Standard Time', - 'Pacific/Truk' => 'West Pacific Standard Time', - 'Pacific/Wake' => 'UTC+12', - 'Pacific/Wallis' => 'UTC+12', - 'Etc/GMT' => 'GMT Standard Time', - 'Etc/GMT-1' => 'W. Central Africa Standard Time', - 'Etc/GMT-10' => 'West Pacific Standard Time', - 'Etc/GMT-11' => 'Central Pacific Standard Time', - 'Etc/GMT-12' => 'UTC+12', - 'Etc/GMT-13' => 'UTC+13', - 'Etc/GMT-14' => 'Line Islands Standard Time', - 'Etc/GMT-2' => 'South Africa Standard Time', - 'Etc/GMT-3' => 'E. Africa Standard Time', - 'Etc/GMT-4' => 'Arabian Standard Time', - 'Etc/GMT-5' => 'West Asia Standard Time', - 'Etc/GMT-6' => 'Central Asia Standard Time', - 'Etc/GMT-7' => 'SE Asia Standard Time', - 'Etc/GMT-8' => 'Singapore Standard Time', - 'Etc/GMT-9' => 'Tokyo Standard Time', - 'Etc/GMT+1' => 'Cape Verde Standard Time', - 'Etc/GMT+10' => 'Hawaiian Standard Time', - 'Etc/GMT+11' => 'UTC-11', - 'Etc/GMT+12' => 'Dateline Standard Time', - 'Etc/GMT+2' => 'Mid-Atlantic Standard Time', - 'Etc/GMT+3' => 'SA Eastern Standard Time', - 'Etc/GMT+4' => 'SA Western Standard Time', - 'Etc/GMT+5' => 'SA Pacific Standard Time', - 'Etc/GMT+6' => 'Central America Standard Time', - 'Etc/GMT+7' => 'US Mountain Standard Time', - 'Etc/GMT+8' => 'UTC-08', - 'Etc/GMT+9' => 'UTC-09', - 'Etc/UTC' => 'UTC', - 'UTC' => 'UTC', - 'Z' => 'UTC', - ]; - - /** - * conversion table of EAS (Microsoft/Windows) time zones to IANA time zones - * @var array $eastoiana - */ - private static $eastoiana = [ - 'AUS Central Standard Time' => 'Australia/Darwin', - 'Aus Central W. Standard Time' => 'Australia/Eucla', - 'AUS Eastern Standard Time' => 'Australia/Sydney', - 'Afghanistan Standard Time' => 'Asia/Kabul', - 'Alaskan Standard Time' => 'America/Anchorage', - 'Aleutian Standard Time' => 'America/Adak', - 'Altai Standard Time' => 'Asia/Barnaul', - 'Arab Standard Time' => 'Asia/Riyadh', - 'Arabian Standard Time' => 'Asia/Dubai', - 'Arabic Standard Time' => 'Asia/Baghdad', - 'Argentina Standard Time' => 'America/Buenos_Aires', - 'Astrakhan Standard Time' => 'Europe/Astrakhan', - 'Atlantic Standard Time' => 'America/Halifax', - 'Azerbaijan Standard Time' => 'Asia/Baku', - 'Azores Standard Time' => 'Atlantic/Azores', - 'Bahia Standard Time' => 'America/Bahia', - 'Bangladesh Standard Time' => 'Asia/Dhaka', - 'Belarus Standard Time' => 'Europe/Minsk', - 'Bougainville Standard Time' => 'Pacific/Bougainville', - 'Cape Verde Standard Time' => 'Atlantic/Cape_Verde', - 'Canada Central Standard Time' => 'America/Regina', - 'Caucasus Standard Time' => 'Asia/Yerevan', - 'Cen. Australia Standard Time' => 'Australia/Adelaide', - 'Central America Standard Time' => 'America/Guatemala', - 'Central Asia Standard Time' => 'Asia/Almaty', - 'Central Brazilian Standard Time' => 'America/Cuiaba', - 'Central Europe Standard Time' => 'Europe/Budapest', - 'Central European Standard Time' => 'Europe/Warsaw', - 'Central Pacific Standard Time' => 'Pacific/Guadalcanal', - 'Central Standard Time' => 'America/Chicago', - 'Central Standard Time (Mexico)' => 'America/Mexico_City', - 'Chatham Islands Standard Time' => 'Pacific/Chatham', - 'China Standard Time' => 'Asia/Shanghai', - 'Coordinated Universal Time' => 'UTC', - 'Cuba Standard Time' => 'America/Havana', - 'Dateline Standard Time' => 'Etc/GMT+12', - 'E. Africa Standard Time' => 'Africa/Nairobi', - 'E. Australia Standard Time' => 'Australia/Brisbane', - 'E. Europe Standard Time' => 'Europe/Chisinau', - 'E. South America Standard Time' => 'America/Sao_Paulo', - 'Easter Island Standard Time' => 'Pacific/Easter', - 'Eastern Standard Time' => 'America/Toronto', - 'Eastern Standard Time (Mexico)' => 'America/Cancun', - 'Egypt Standard Time' => 'Africa/Cairo', - 'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg', - 'FLE Standard Time' => 'Europe/Kiev', - 'Fiji Standard Time' => 'Pacific/Fiji', - 'GMT Standard Time' => 'Europe/London', - 'GTB Standard Time' => 'Europe/Bucharest', - 'Georgian Standard Time' => 'Asia/Tbilisi', - 'Greenland Standard Time' => 'America/Godthab', - 'Greenland (Danmarkshavn)' => 'America/Godthab', - 'Greenwich Standard Time' => 'Atlantic/Reykjavik', - 'Haiti Standard Time' => 'America/Port-au-Prince', - 'Hawaiian Standard Time' => 'Pacific/Honolulu', - 'India Standard Time' => 'Asia/Calcutta', - 'Iran Standard Time' => 'Asia/Tehran', - 'Israel Standard Time' => 'Asia/Jerusalem', - 'Jordan Standard Time' => 'Asia/Amman', - 'Kaliningrad Standard Time' => 'Europe/Kaliningrad', - 'Kamchatka Standard Time' => 'Asia/Kamchatka', - 'Korea Standard Time' => 'Asia/Seoul', - 'Libya Standard Time' => 'Africa/Tripoli', - 'Line Islands Standard Time' => 'Pacific/Kiritimati', - 'Lord Howe Standard Time' => 'Australia/Lord_Howe', - 'Magadan Standard Time' => 'Asia/Magadan', - 'Magallanes Standard Time' => 'America/Punta_Arenas', - 'Malaysia Standard Time' => 'Asia/Kuala_Lumpur', - 'Marquesas Standard Time' => 'Pacific/Marquesas', - 'Mauritius Standard Time' => 'Indian/Mauritius', - 'Mid-Atlantic Standard Time' => 'Atlantic/South_Georgia', - 'Middle East Standard Time' => 'Asia/Beirut', - 'Montevideo Standard Time' => 'America/Montevideo', - 'Morocco Standard Time' => 'Africa/Casablanca', - 'Mountain Standard Time' => 'America/Denver', - 'Mountain Standard Time (Mexico)' => 'America/Chihuahua', - 'Myanmar Standard Time' => 'Asia/Rangoon', - 'N. Central Asia Standard Time' => 'Asia/Novosibirsk', - 'Namibia Standard Time' => 'Africa/Windhoek', - 'Nepal Standard Time' => 'Asia/Katmandu', - 'New Zealand Standard Time' => 'Pacific/Auckland', - 'Newfoundland Standard Time' => 'America/St_Johns', - 'Norfolk Standard Time' => 'Pacific/Norfolk', - 'North Asia East Standard Time' => 'Asia/Irkutsk', - 'North Asia Standard Time' => 'Asia/Krasnoyarsk', - 'North Korea Standard Time' => 'Asia/Pyongyang', - 'Omsk Standard Time' => 'Asia/Omsk', - 'Pacific SA Standard Time' => 'America/Santiago', - 'Pacific Standard Time' => 'America/Los_Angeles', - 'Pacific Standard Time (Mexico)' => 'America/Tijuana', - 'Pakistan Standard Time' => 'Asia/Karachi', - 'Paraguay Standard Time' => 'America/Asuncion', - 'Qyzylorda Standard Time' => 'Asia/Qyzylorda', - 'Romance Standard Time' => 'Europe/Paris', - 'Russian Standard Time' => 'Europe/Moscow', - 'Russia Time Zone 10' => 'Asia/Srednekolymsk', - 'Kamchatka Standard Time' => 'Asia/Kamchatka', - 'Russia Time Zone 3' => 'Europe/Samara', - 'SA Eastern Standard Time' => 'America/Cayenne', - 'SA Pacific Standard Time' => 'America/Bogota', - 'SA Western Standard Time' => 'America/La_Paz', - 'SE Asia Standard Time' => 'Asia/Bangkok', - 'Saint Pierre Standard Time' => 'America/Miquelon', - 'Sakhalin Standard Time' => 'Asia/Sakhalin', - 'Samoa Standard Time' => 'Pacific/Apia', - 'Sao Tome Standard Time' => 'Africa/Sao_Tome', - 'Saratov Standard Time' => 'Europe/Saratov', - 'Singapore Standard Time' => 'Asia/Singapore', - 'South Africa Standard Time' => 'Africa/Johannesburg', - 'South Sudan Standard Time' => 'Africa/Juba', - 'Sri Lanka Standard Time' => 'Asia/Colombo', - 'Sudan Standard Time' => 'Africa/Khartoum', - 'Syria Standard Time' => 'Asia/Damascus', - 'Taipei Standard Time' => 'Asia/Taipei', - 'Tasmania Standard Time' => 'Australia/Hobart', - 'Tocantins Standard Time' => 'America/Araguaina', - 'Tokyo Standard Time' => 'Asia/Tokyo', - 'Tomsk Standard Time' => 'Asia/Tomsk', - 'Tonga Standard Time' => 'Pacific/Tongatapu', - 'Transbaikal Standard Time' => 'Asia/Chita', - 'Turkey Standard Time' => 'Europe/Istanbul', - 'Turks And Caicos Standard Time' => 'America/Grand_Turk', - 'US Eastern Standard Time' => 'America/Indianapolis', - 'US Mountain Standard Time' => 'America/Phoenix', - 'UTC' => 'Etc/GMT', - 'UTC+13' => 'Etc/GMT-13', - 'UTC+12' => 'Etc/GMT-12', - 'UTC-02' => 'Etc/GMT+2', - 'UTC-09' => 'Etc/GMT+9', - 'UTC-11' => 'Etc/GMT+11', - 'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar', - 'Venezuela Standard Time' => 'America/Caracas', - 'Vladivostok Standard Time' => 'Asia/Vladivostok', - 'Volgograd Standard Time' => 'Europe/Volgograd', - 'W. Australia Standard Time' => 'Australia/Perth', - 'W. Central Africa Standard Time' => 'Africa/Lagos', - 'W. Europe Standard Time' => 'Europe/Berlin', - 'W. Mongolia Standard Time' => 'Asia/Hovd', - 'West Asia Standard Time' => 'Asia/Tashkent', - 'West Bank Standard Time' => 'Asia/Hebron', - 'West Pacific Standard Time' => 'Pacific/Port_Moresby', - 'Yakutsk Standard Time' => 'Asia/Yakutsk', - 'Yukon Standard Time' => 'America/Whitehorse', - ]; - - /** - * Retrieves EAS (Microsoft/Windows) time zone information - * - * @since Release 1.0.0 - * - * @param string $name eas time zone name - * - * @return object time zone information object on success, or null on failure - */ - public static function findZone(?string $name) : ?object { - - if (isset(self::$easzones[$name])) { - return json_decode(self::$easzones[$name]); - } else { - return null; - } - - } - - /** - * Retrieves EAS (Microsoft/Windows) time zone mutation information - * - * @since Release 1.0.0 - * - * @param string|null $name eas time zone name - * @param DateTime|Int|null $date date to find mutation for - * - * @return object time zone information object on success, or null on failure - */ - public static function findZoneMutation(string|null $name, \DateTime|Int|null $date = null, bool $flag = false) : object|null { - - $zone = self::findZone($name); - - // evaluate if time zone was found - if (!isset($zone)) { - // evaluate if default flag was set - if ($flag) { - $zone = self::findZone('UTC'); - } - else { - return null; - } - } - - // evaluate if date is in DateTime format - if ($date instanceof \DateTime) { - // convert date to epoch time stamp - $date = $date->getTimestamp(); - } - // evaluate if date is null - elseif ($date === null) { - // assign current epoch time stamp if one was not provided - $date = time(); - } - - foreach ($zone->Mutations as $entry) { - if ($entry->Effective > $date) { - break; - } else { - $mutation = $entry; - } - } - - return $mutation; - - } - - /** - * Converts IANA time zone name to EAS (Microsoft/Windows) time zone name - * - * @since Release 1.0.0 - * - * @param string $name iana time zone name - * - * @return string valid EWS time zone name on success, or null on failure - */ - public static function fromIANA(?string $name): ?string { - - if (isset(self::$ianatoeas[$name])) { - return self::$ianatoeas[$name]; - } else { - return null; - } - - } - - /** - * Converts EAS (Microsoft/Windows) time zone name to IANA time zone name - * - * @since Release 1.0.0 - * - * @param string $name eas time zone name - * - * @return string valid IANA time zone name on success, or null on failure - */ - public static function toIANA(?string $name): ?string { - - if (isset(self::$eastoiana[$name])) { - return self::$eastoiana[$name]; - } else { - return null; - } - - } - - /** - * Converts DateTimeZone object to EAS (Microsoft/Windows) time zone name - * - * @since Release 1.0.0 - * - * @param DateTimeZone $zone - * - * @return string valid EWS time zone name on success, or null on failure - */ - public static function fromDateTimeZone(DateTimeZone $zone): ?string { - - // convert IANA time zone name to EWS - $zone = self::fromIANA($zone->getName()); - // evaluate if we recieve a converted name - // return time zone name if zone was found - if (!empty($zone)) { - return $zone; - } - else { - return null; - } - - } - - /** - * Converts EAS (Microsoft/Windows) time zone name to DateTimeZone object - * - * @since Release 1.0.0 - * - * @param string $name eas time zone name - * - * @return DateTimeZone valid DateTimeZone object on success, or null on failure - */ - public static function toDateTimeZone(string $name): ?DateTimeZone { - - // evaluate if name exists in conversion table - if (isset(self::$eastoiana[$name])) { - $zone = @timezone_open(self::$eastoiana[$name]); - } - // otherwise attempt to convert time zone name - else { - $zone = @timezone_open($name); - } - // return time zone object if zone was found - if ($zone instanceof DateTimeZone) { - return $zone; - } - else { - return null; - } - - } - -} \ No newline at end of file diff --git a/src/components/AdminSettings.vue b/src/components/AdminSettings.vue index f70f699..051ca03 100644 --- a/src/components/AdminSettings.vue +++ b/src/components/AdminSettings.vue @@ -23,11 +23,11 @@