UNPKG

lumenize

Version:

Illuminating the forest AND the trees in your data.

841 lines (719 loc) 533 kB
/* lumenize version: 1.2.0 */ require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"wlmLJI":[function(require,module,exports){ // Generated by CoffeeScript 1.10.0 /* * Lumenize # Lumenize provides tools for aggregating data and creating time series and other temporal visualizations. The primary time-series aggregating functionality is provided by: * Lumenize.TimeSeriesCalculator - Sets of single-metric series or group-by series * Lumenize.TransitionsCalculator - Counts or sums for items moving from one state to another * Lumenize.TimeInStateCalculator - Cumulative amount of time unique work items spend in a particular state Simple group-by, 2D pivot-table and even multi-dimensional aggregations (OLAP cube) are provided by: * Lumenize.OLAPCube - Used by above three Calculators but also useful stand-alone, particularly for hierarchical roll-ups All of the above use the mathematical and statistical functions provided by: * Lumenize.functions - count, sum, standardDeviation, percentile coverage, min, max, etc. Three transformation functions are provided: * Lumenize.arrayOfMaps_To_CSVStyleArray - Used to transform from record to table format * Lumenize.csvStyleArray_To_ArrayOfMaps - Used to transform from table to record format * Lumenize.arrayOfMaps_To_HighChartsSeries - Used to transform from record format to the format expected by the HighCharts charting library And last, additional functionality is provided by: * Lumenize.histogram - create a histogram of scatter data * Lumenize.utils - utility methods used by the rest of Lumenize (type, clone, array/object functions, etc.) */ (function() { var datatransform, tzTime; tzTime = require('tztime'); exports.Time = tzTime.Time; exports.TimelineIterator = tzTime.TimelineIterator; exports.Timeline = tzTime.Timeline; exports.utils = tzTime.utils; exports.TimeInStateCalculator = require('./src/TimeInStateCalculator').TimeInStateCalculator; exports.TransitionsCalculator = require('./src/TransitionsCalculator').TransitionsCalculator; exports.TimeSeriesCalculator = require('./src/TimeSeriesCalculator').TimeSeriesCalculator; datatransform = require('./src/dataTransform'); exports.arrayOfMaps_To_CSVStyleArray = datatransform.arrayOfMaps_To_CSVStyleArray; exports.csvStyleArray_To_ArrayOfMaps = datatransform.csvStyleArray_To_ArrayOfMaps; exports.arrayOfMaps_To_HighChartsSeries = datatransform.arrayOfMaps_To_HighChartsSeries; exports.csvString_To_CSVStyleArray = datatransform.csvString_To_CSVStyleArray; exports.csvStyleArray_To_CSVString = datatransform.csvStyleArray_To_CSVString; exports.functions = require('./src/functions').functions; exports.histogram = require('./src/histogram').histogram; exports.multiRegression = require('./src/multiRegression').multiRegression; exports.table = require('./src/table').table; exports.OLAPCube = require('./src/OLAPCube').OLAPCube; exports.anova = require('./src/anova').anova; exports.distributions = require('./src/distributions').distributions; exports.BayesianClassifier = require('./src/Classifier').BayesianClassifier; exports.Classifier = require('./src/Classifier').Classifier; exports.Store = require('./src/Store').Store; exports.RandomPicker = require('./src/RandomPicker').RandomPicker; }).call(this); },{"./src/Classifier":11,"./src/OLAPCube":12,"./src/RandomPicker":13,"./src/Store":14,"./src/TimeInStateCalculator":15,"./src/TimeSeriesCalculator":16,"./src/TransitionsCalculator":17,"./src/anova":18,"./src/dataTransform":20,"./src/distributions":21,"./src/functions":22,"./src/histogram":23,"./src/multiRegression":24,"./src/table":25,"tztime":10}],"lumenize":[function(require,module,exports){ module.exports=require('wlmLJI'); },{}],3:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // Split a filename into [root, dir, basename, ext], unix version // 'root' is just a slash, or nothing. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; var splitPath = function(filename) { return splitPathRe.exec(filename).slice(1); }; // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = exports.isAbsolute(path), trailingSlash = substr(path, -1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.isAbsolute = function(path) { return path.charAt(0) === '/'; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function(p, index) { if (typeof p !== 'string') { throw new TypeError('Arguments to path.join must be strings'); } return p; }).join('/')); }; // path.relative(from, to) // posix version exports.relative = function(from, to) { from = exports.resolve(from).substr(1); to = exports.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function(path) { var result = splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; }; exports.basename = function(path, ext) { var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPath(path)[3]; }; function filter (xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; }).call(this,require("FWaASH")) },{"FWaASH":4}],4:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; process.nextTick = (function () { var canSetImmediate = typeof window !== 'undefined' && window.setImmediate; var canPost = typeof window !== 'undefined' && window.postMessage && window.addEventListener ; if (canSetImmediate) { return function (f) { return window.setImmediate(f) }; } if (canPost) { var queue = []; window.addEventListener('message', function (ev) { var source = ev.source; if ((source === window || source === null) && ev.data === 'process-tick') { ev.stopPropagation(); if (queue.length > 0) { var fn = queue.shift(); fn(); } } }, true); return function nextTick(fn) { queue.push(fn); window.postMessage('process-tick', '*'); }; } return function nextTick(fn) { setTimeout(fn, 0); }; })(); process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); } // TODO(shtylman) process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; },{}],5:[function(require,module,exports){ /* * Copyright 2010 Matthew Eernisse (mde@fleegix.org) * and Open Source Applications Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Credits: Ideas included from incomplete JS implementation of Olson * parser, "XMLDAte" by Philippe Goetz (philippe.goetz@wanadoo.fr) * * Contributions: * Jan Niehusmann * Ricky Romero * Preston Hunt (prestonhunt@gmail.com), * Dov. B Katz (dov.katz@morganstanley.com), * Peter Bergström (pbergstr@mac.com) */ if (typeof fleegix == 'undefined') { var fleegix = {}; } if (typeof exports.timezoneJS == 'undefined') { exports.timezoneJS = {}; } path = require('path'); utils = require('../src/utils'); exports.timezoneJS.timezone = new function() { var _this = this; var monthMap = { 'jan': 0, 'feb': 1, 'mar': 2, 'apr': 3,'may': 4, 'jun': 5, 'jul': 6, 'aug': 7, 'sep': 8, 'oct': 9, 'nov': 10, 'dec': 11 }; var dayMap = {'sun': 0,'mon' :1, 'tue': 2, 'wed': 3, 'thu': 4, 'fri': 5, 'sat': 6 }; var regionMap = {'EST':'northamerica','MST':'northamerica','HST':'northamerica','EST5EDT':'northamerica','CST6CDT':'northamerica','MST7MDT':'northamerica','PST8PDT':'northamerica','America':'northamerica','Pacific':'australasia','Atlantic':'europe','Africa':'africa','Indian':'africa','Antarctica':'antarctica','Asia':'asia','Australia':'australasia','Europe':'europe','WET':'europe','CET':'europe','MET':'europe','EET':'europe'}; var regionExceptions = {'Pacific/Honolulu':'northamerica','Atlantic/Bermuda':'northamerica','Atlantic/Cape_Verde':'africa','Atlantic/St_Helena':'africa','Indian/Kerguelen':'antarctica','Indian/Chagos':'asia','Indian/Maldives':'asia','Indian/Christmas':'australasia','Indian/Cocos':'australasia','America/Danmarkshavn':'europe','America/Scoresbysund':'europe','America/Godthab':'europe','America/Thule':'europe','Asia/Yekaterinburg':'europe','Asia/Omsk':'europe','Asia/Novosibirsk':'europe','Asia/Krasnoyarsk':'europe','Asia/Irkutsk':'europe','Asia/Yakutsk':'europe','Asia/Vladivostok':'europe','Asia/Sakhalin':'europe','Asia/Magadan':'europe','Asia/Kamchatka':'europe','Asia/Anadyr':'europe','Africa/Ceuta':'europe','America/Argentina/Buenos_Aires':'southamerica','America/Argentina/Cordoba':'southamerica','America/Argentina/Tucuman':'southamerica','America/Argentina/La_Rioja':'southamerica','America/Argentina/San_Juan':'southamerica','America/Argentina/Jujuy':'southamerica','America/Argentina/Catamarca':'southamerica','America/Argentina/Mendoza':'southamerica','America/Argentina/Rio_Gallegos':'southamerica','America/Argentina/Ushuaia':'southamerica','America/Aruba':'southamerica','America/La_Paz':'southamerica','America/Noronha':'southamerica','America/Belem':'southamerica','America/Fortaleza':'southamerica','America/Recife':'southamerica','America/Araguaina':'southamerica','America/Maceio':'southamerica','America/Bahia':'southamerica','America/Sao_Paulo':'southamerica','America/Campo_Grande':'southamerica','America/Cuiaba':'southamerica','America/Porto_Velho':'southamerica','America/Boa_Vista':'southamerica','America/Manaus':'southamerica','America/Eirunepe':'southamerica','America/Rio_Branco':'southamerica','America/Santiago':'southamerica','Pacific/Easter':'southamerica','America/Bogota':'southamerica','America/Curacao':'southamerica','America/Guayaquil':'southamerica','Pacific/Galapagos':'southamerica','Atlantic/Stanley':'southamerica','America/Cayenne':'southamerica','America/Guyana':'southamerica','America/Asuncion':'southamerica','America/Lima':'southamerica','Atlantic/South_Georgia':'southamerica','America/Paramaribo':'southamerica','America/Port_of_Spain':'southamerica','America/Montevideo':'southamerica','America/Caracas':'southamerica'}; function invalidTZError(t) { throw new Error('Timezone "' + t + '" is either incorrect, or not loaded in the timezone registry.'); } function builtInLoadZoneFile(fileName, opts) { if (typeof fleegix.xhr == 'undefined') { throw new Error('Please use the Fleegix.js XHR module, or define your own transport mechanism for downloading zone files.'); } var url = _this.zoneFileBasePath + '/' + fileName; if (!opts.async) { var ret = fleegix.xhr.doReq({ url: url, async: false }); return _this.parseZones(ret); } else { return fleegix.xhr.send({ url: url, method: 'get', handleSuccess: function (str) { if (_this.parseZones(str)) { if (typeof opts.callback == 'function') { opts.callback(); } } return true; }, handleErr: function () { throw new Error('Error retrieving "' + url + '" zoneinfo file.'); } }); } } // //function myLoadZoneFile(fileName, opts) { // var url = path.join(_this.zoneFileBasePath, fileName) + '.lzw'; // // // If running in node.js // if (fs.readFileSync) { // url = path.join(__dirname, url); // // var ret // if (fs.existsSync(url)) { // ret = utils.lzwDecode(fs.readFileSync(url, 'utf8')); // } else { // throw new Error('Cannot find ' + url + ' from directory ' + __dirname); // } // return _this.parseZones(ret); // } // // // If running in the browser assume tz files are "fileified" into the source and can be "require"d // var files = require('files'); // var filesName = 'tz/' + fileName + '.lzw' // if (files[filesName]) { // return _this.parseZones(utils.lzwDecode(files[filesName])); // } else { // throw new Error(filesName + ' not found embedded in this package.'); // }; //} function getRegionForTimezone(tz) { var exc = regionExceptions[tz]; var ret; if (exc) { return exc; } else { reg = tz.split('/')[0]; ret = regionMap[reg]; // If there's nothing listed in the main regions for // this TZ, check the 'backward' links if (!ret) { var link = _this.zones[tz]; if (typeof link == 'string') { return getRegionForTimezone(link); } else { // Backward-compat file hasn't loaded yet, try looking in there if (!_this.loadedZones.backward) { // This is for obvious legacy zones (e.g., Iceland) that // don't even have a prefix like "America/" that look like // normal zones var parsed = _this.loadZoneFile('backward', true); return getRegionForTimezone(tz); } else { invalidTZError(tz); } } } return ret; } } function parseTimeString(str) { var pat = /(\d+)(?::0*(\d*))?(?::0*(\d*))?([wsugz])?$/; var hms = str.match(pat); hms[1] = parseInt(hms[1], 10); hms[2] = hms[2] ? parseInt(hms[2], 10) : 0; hms[3] = hms[3] ? parseInt(hms[3], 10) : 0; return hms; } function getZone(dt, tz) { var t = tz; var zoneList = _this.zones[t]; // Follow links to get to an acutal zone while (typeof zoneList == "string") { t = zoneList; zoneList = _this.zones[t]; } if (!zoneList) { // Backward-compat file hasn't loaded yet, try looking in there if (!_this.loadedZones.backward) { // This is for backward entries like "America/Fort_Wayne" that // getRegionForTimezone *thinks* it has a region file and zone // for (e.g., America => 'northamerica'), but in reality it's a // legacy zone we need the backward file for var parsed = _this.loadZoneFile('backward', true); return getZone(dt, tz); } invalidTZError(t); } for(var i = 0; i < zoneList.length; i++) { var z = zoneList[i]; if (!z[3]) { break; } var yea = parseInt(z[3], 10); var mon = 11; var dat = 31; if (z[4]) { mon = monthMap[z[4].substr(0, 3).toLowerCase()]; dat = parseInt(z[5], 10); } var t = z[6] ? z[6] : '23:59:59'; t = parseTimeString(t); var d = Date.UTC(yea, mon, dat, t[1], t[2], t[3]); if (dt.getTime() < d) { break; } } if (i == zoneList.length) { throw new Error('No Zone found for "' + timezone + '" on ' + dt); } return zoneList[i]; } function getBasicOffset(z) { var off = parseTimeString(z[0]); var adj = z[0].indexOf('-') == 0 ? -1 : 1 off = adj * (((off[1] * 60 + off[2]) *60 + off[3]) * 1000); return -off/60/1000; } // if isUTC is true, date is given in UTC, otherwise it's given // in local time (ie. date.getUTC*() returns local time components) function getRule( date, zone, isUTC ) { var ruleset = zone[1]; var basicOffset = getBasicOffset( zone ); // Convert a date to UTC. Depending on the 'type' parameter, the date // parameter may be: // 'u', 'g', 'z': already UTC (no adjustment) // 's': standard time (adjust for time zone offset but not for DST) // 'w': wall clock time (adjust for both time zone and DST offset) // // DST adjustment is done using the rule given as third argument var convertDateToUTC = function( date, type, rule ) { var offset = 0; if(type == 'u' || type == 'g' || type == 'z') { // UTC offset = 0; } else if(type == 's') { // Standard Time offset = basicOffset; } else if(type == 'w' || !type ) { // Wall Clock Time offset = getAdjustedOffset(basicOffset,rule); } else { throw("unknown type "+type); } offset *= 60*1000; // to millis return new Date( date.getTime() + offset ); } // Step 1: Find applicable rules for this year. // Step 2: Sort the rules by effective date. // Step 3: Check requested date to see if a rule has yet taken effect this year. If not, // Step 4: Get the rules for the previous year. If there isn't an applicable rule for last year, then // there probably is no current time offset since they seem to explicitly turn off the offset // when someone stops observing DST. // FIXME if this is not the case and we'll walk all the way back (ugh). // Step 5: Sort the rules by effective date. // Step 6: Apply the most recent rule before the current time. var convertRuleToExactDateAndTime = function( yearAndRule, prevRule ) { var year = yearAndRule[0]; var rule = yearAndRule[1]; // Assume that the rule applies to the year of the given date. var months = { "Jan": 0, "Feb": 1, "Mar": 2, "Apr": 3, "May": 4, "Jun": 5, "Jul": 6, "Aug": 7, "Sep": 8, "Oct": 9, "Nov": 10, "Dec": 11 }; var days = { "sun": 0, "mon": 1, "tue": 2, "wed": 3, "thu": 4, "fri": 5, "sat": 6 } var hms = parseTimeString( rule[ 5 ] ); var effectiveDate; if ( !isNaN( rule[ 4 ] ) ) // If we have a specific date, use that! { effectiveDate = new Date( Date.UTC( year, months[ rule[ 3 ] ], rule[ 4 ], hms[ 1 ], hms[ 2 ], hms[ 3 ], 0 ) ); } else // Let's hunt for the date. { var targetDay, operator; if ( rule[ 4 ].substr( 0, 4 ) === "last" ) // Example: lastThu { // Start at the last day of the month and work backward. effectiveDate = new Date( Date.UTC( year, months[ rule[ 3 ] ] + 1, 1, hms[ 1 ] - 24, hms[ 2 ], hms[ 3 ], 0 ) ); targetDay = days[ rule[ 4 ].substr( 4, 3 ).toLowerCase( ) ]; operator = "<="; } else // Example: Sun>=15 { // Start at the specified date. effectiveDate = new Date( Date.UTC( year, months[ rule[ 3 ] ], rule[ 4 ].substr( 5 ), hms[ 1 ], hms[ 2 ], hms[ 3 ], 0 ) ); targetDay = days[ rule[ 4 ].substr( 0, 3 ).toLowerCase( ) ]; operator = rule[ 4 ].substr( 3, 2 ); } var ourDay = effectiveDate.getUTCDay( ); if ( operator === ">=" ) // Go forwards. { effectiveDate.setUTCDate( effectiveDate.getUTCDate( ) + ( targetDay - ourDay + ( ( targetDay < ourDay ) ? 7 : 0 ) ) ); } else // Go backwards. Looking for the last of a certain day, or operator is "<=" (less likely). { effectiveDate.setUTCDate( effectiveDate.getUTCDate( ) + ( targetDay - ourDay - ( ( targetDay > ourDay ) ? 7 : 0 ) ) ); } } // if previous rule is given, correct for the fact that the starting time of the current // rule may be specified in local time if(prevRule) { effectiveDate = convertDateToUTC(effectiveDate, hms[4], prevRule); } return effectiveDate; } var findApplicableRules = function( year, ruleset ) { var applicableRules = []; for ( var i in ruleset ) { if ( Number( ruleset[ i ][ 0 ] ) <= year ) // Exclude future rules. { if ( Number( ruleset[ i ][ 1 ] ) >= year // Date is in a set range. || ( Number( ruleset[ i ][ 0 ] ) === year && ruleset[ i ][ 1 ] === "only" ) // Date is in an "only" year. || ruleset[ i ][ 1 ] === "max" // We're in a range from the start year to infinity. ) { // It's completely okay to have any number of matches here. // Normally we should only see two, but that doesn't preclude other numbers of matches. // These matches are applicable to this year. applicableRules.push( [year, ruleset[ i ]] ); } } } return applicableRules; } var compareDates = function( a, b, prev ) { if ( a.constructor !== Date ) { a = convertRuleToExactDateAndTime( a, prev ); } else if(prev) { a = convertDateToUTC(a, isUTC?'u':'w', prev); } if ( b.constructor !== Date ) { b = convertRuleToExactDateAndTime( b, prev ); } else if(prev) { b = convertDateToUTC(b, isUTC?'u':'w', prev); } a = Number( a ); b = Number( b ); return a - b; } var year = date.getUTCFullYear( ); var applicableRules; applicableRules = findApplicableRules( year, _this.rules[ ruleset ] ); applicableRules.push( date ); // While sorting, the time zone in which the rule starting time is specified // is ignored. This is ok as long as the timespan between two DST changes is // larger than the DST offset, which is probably always true. // As the given date may indeed be close to a DST change, it may get sorted // to a wrong position (off by one), which is corrected below. applicableRules.sort( compareDates ); if ( applicableRules.indexOf( date ) < 2 ) { // If there are not enough past DST rules... applicableRules = applicableRules.concat(findApplicableRules( year-1, _this.rules[ ruleset ] )); applicableRules.sort( compareDates ); } var pinpoint = applicableRules.indexOf( date ); if ( pinpoint > 1 && compareDates( date, applicableRules[pinpoint-1], applicableRules[pinpoint-2][1] ) < 0 ) { // the previous rule does not really apply, take the one before that return applicableRules[ pinpoint - 2 ][1]; } else if ( pinpoint > 0 && pinpoint < applicableRules.length - 1 && compareDates( date, applicableRules[pinpoint+1], applicableRules[pinpoint-1][1] ) > 0) { // the next rule does already apply, take that one return applicableRules[ pinpoint + 1 ][1]; } else if ( pinpoint === 0 ) { // no applicable rule found in this and in previous year return null; } else { return applicableRules[ pinpoint - 1 ][1]; } } function getAdjustedOffset(off, rule) { var save = rule[6]; var t = parseTimeString(save); var adj = save.indexOf('-') == 0 ? -1 : 1; var ret = (adj*(((t[1] *60 + t[2]) * 60 + t[3]) * 1000)); ret = ret/60/1000; ret -= off ret = -Math.ceil(ret); return ret; } function getAbbreviation(zone, rule) { var res; var base = zone[2]; if (base.indexOf('%s') > -1) { var repl; if (rule) { repl = rule[7]=='-'?'':rule[7]; } // FIXME: Right now just falling back to Standard -- // apparently ought to use the last valid rule, // although in practice that always ought to be Standard else { repl = 'S'; } res = base.replace('%s', repl); } else if (base.indexOf('/') > -1) { // chose one of two alternative strings var t = parseTimeString(rule[6]); var isDst = (t[1])||(t[2])||(t[3]); res = base.split("/",2)[isDst?1:0]; } else { res = base; } return res; } this.zoneFileBasePath; this.zoneFiles = ['africa', 'antarctica', 'asia', 'australasia', 'backward', 'etcetera', 'europe', 'northamerica', 'pacificnew', 'southamerica']; this.loadingSchemes = { PRELOAD_ALL: 'preloadAll', LAZY_LOAD: 'lazyLoad', MANUAL_LOAD: 'manualLoad' } this.loadingScheme = this.loadingSchemes.PRELOAD_ALL; this.defaultZoneFile = this.loadingScheme == this.loadingSchemes.PRELOAD_ALL ? this.zoneFiles : 'northamerica'; this.loadedZones = {}; this.zones = {}; this.rules = {}; this.init = function (o) { var opts = { async: true }; var sync = false; var def = this.defaultZoneFile; var parsed; // Override default with any passed-in opts for (var p in o) { opts[p] = o[p]; } if (typeof def == 'string') { throw new Error('in init def==string') parsed = this.loadZoneFile(def, opts); } else { var ret this.loadedZones['africa'] = true; ret = utils.lzwDecode("Rule\tAlgeria\t1916\tonly\t-\tJunČ4\t23:00sČġ0\tS\nĀĂĄĆĈĊČĎĐččĖ\tOctĨĚ>=1ĞĠĢĤħ-ĪāăąćĉċĴ7đēĕėMarĞĝğĦĤ1ĦĨņĬʼnįŌĎ8ŏĔĶœŕ 9ŀřĥĢŝīňĮŋıĵĒŦŒŔ\t ĿŘłŮħĩűĭŊİč2ħŷő\tFebĜŬſśůƂŇƄšıƈťƋĸĺğƑģ\tńŞŲƅŢ2ĿƊŧź1ŗŁơƓƁƤƗŴƇƩŐĶęěƨƠŃĖƳŠƵ93ūƪėSepČŽƯŚŜƕşųƆǃDžƸėNovıŻƱƢƿƃǁǓ4ĝč45ĶApŕMĒĽĿ 2ŜǝǐƥƘǥĝdžķĹŻŤǰŜƣǠǒŢǦƛĶLjNJďǜǿǟƖǡŢ7ƷŸĄǪĞǧžưǏǀȂıȐȅLJljĞĐȗƾŅȁƦȜŎǹœĕ Đ 0DzșȦǶ97ȩǖǺƞǯȰůȀȍțč7ŤȪź2ĝżȱƔȚȧɁɃȸȇĞ2ŻƯǞȥȿɌ98Ɖȸǩŕ2ǧȯɉƲȳǂɚȞȹ\t3ǯDZȽƿZĒňfĉca/ʼniĈŃ:1DZɼ ėLMTČ8Ď Ũż5 ɡ01\n\tʐȼ9:ƼėPʂŵ1ʇŔżʎʐƢŜȎ\tWE%sʃǥ0 ƍbǰʊǾĢʏʐǝʢCʥʧı46 Ɲʋ7ʲʠůėʤʨ95ʻJanǰ9ˀǝėʶ˅63 ɝż4ˀȼħʢʤʦ˅ȶʼĹǰʞʳʡțʶ˞Ȝ9ˡtǰ6˙˦ȧ˝ʸč8ʚȫˎŜːET\nɯne˕tlˊtic/Cape_VĈd́-ś34ġ4ɿ\tʁ˅0ʿʟ-ɬń\tCV˅42 ȇˀ̠ɢ̣VȘʊʽ15̡̫Ķ̤˟ʊǘvʮʋ̡̫ˏ̮˽˿ɱɳɵNdjamenŌĦɻ̨ʀʘĴ2˹˂ʣA˟˫̳˘ʟǝǝWA̰ıɚʛrʋ8̢ͣ̈́͘ɰĄɲ̇ɵAbi͊ˊĖȰďġ8̛̙ŵ͗ʟʌ̢Gʂ\nLink˕ͲɴɶͶ͸ˋAΎɵB͌ako\tΈΊΌΔ͇ΐͷ͋ΓΕ/ΗnjāΜΉ΋΍Ρ͵Σˊίͳ̉ĒΙrĕΝήΠεαΒδΏDΙźλΟΦοΤρɵFreetowěφϋ΢πνΏLo͍ʐϕϙʹΑϊϠ/ǘuΙchotĺϟψϢγϤOϧgadougϸάΞϖωϱΦSao_TϜăϮΰϰΓ̃̅̇/St_HeĂ͏ΜƃEgypĺʩɧęlČǧ˚ƀŰƖКМО94ɛȒƝǜˁħȾĬЩНʹȑƋɝУвЦǴ\tжЫ4йȆȠȉХдăсʹɒǷǨȔżнdzƳыǥɒǹа2ŎшȌеЛзǥ3ʹǧǗǙбќɖўЪѣɧлч̭пѕˆȷȒȫČгѰєџЫ5Ŏč5ŤėаёѨѺѫѿɎѵaȬĿХѓЙѻı5ū˵ĿŹҌЦҏШґѿҔ96ѤĨȠ3ħɔщрҜҟij9ЬĶ҃ĿҦѝъҩ8їȸСȕҙȲқ҇əѢǹҸɼҺɊҐҽ8Ǥəҁ\tѶё͡һѪѠəǕҊȬijѹӅӑ9ħčҭҗбӎӄҼәȖʍ̢л̄stύiŻ˚ǎӡӐЫˆĞĢҡɐӨtThuŖȋѩҳѫƈ0ĐǹɐƼɆӾ҆зԂѴƋɐӺuǮӽɭӿҨԁĢ҉кϹ\tӸԐԓгҲԖԋĢӓԚgӴԟɕԊƞӥѭԛ1ħԈԔԫӴ԰ɧɐŪԩҚӱԵЮԎȠԝӻԩҧыƈƭɧѶ̴ԺӏԀԣՇӀĚȡՃԡՅʍǸҷΫɪՋӰՍԬՏɏՀaөԞԲԠŅͅͱΡ̊irΛɬ5ġ˫͔̜ʪƝˀ̷ыEʷ˽ƃGhˊƧӛЬɒȟNJ҄ǿʔħGH̰Ƴվրƙւ̧ĶDecɩҍȋΆͯ̀թξccrċ-˚:5͓͕̚ţˀ΄\t֏Зʦ˾ͰϤBissaӼ̓ġDZƈͿ֪ɾˉˋż́˺͚̺֬Хėֲ֛֝ϤNaլoͶĞʔ7ɻĐճƙ;СˀɔėE͛ıҤշ:ҤĶBס̦0ץȄėשAU˒׬ʟןр͛ЉεאגͶϾddֶ_͵abċ׹Ώ׻խ׽ϤAsmŔ؆έχΡ؉דiϖσr_es_Ђ̄͌؇͈ב؊ؗϤDjibϸ̆آϥؤؖϖK͌pāϼμΦؕ؋ΦǬϵ؀sՂخػؗIn؀ˊɶntր͏ĉvΛكذ׽نوnζmoխْ׼مهĊٗȫϫte׍͆εǬnխvİ֤:4Ł;ך18ҵ̫Ȱٰͽ̙M׀˫Ũٷٯ̖ҤͿR˟̨˸΃׊֮·ƃΉbyŢ5ф҂ǻՇ̷ԻăڎڐҒҶȒׂѧԉڍتڛѿҿȸ҃ūڗՌ̚ڣڑ՗ڞ͹ևԳڢڏڑǧԅңѸůژڬڵҒԄҷڱ֙ڳƖښŢҵͦĝėлڲӛګۆͦэəҡүнҧې˵ڷɜѐĐҎۏڭͦۀȒیĝ۞՜ڽڤəۢƜǻ Ѣ҅ڴ۩8ѾӒяũۃێۧۘə۴ʅҮۭ۸Ԫ۱Ţȵѭѐۥӗۅ۠Ӝԍۿĺ ܈ۄĬېՆڦҊŕӸӫӃɣ܊ھܕɧаܙĉוԳըϤTĉpolӬȰ֧ځֿ˅ƈͬۨċ˨˴ˆˍʟ̷נ˼ۑܴېܷ˅Ӛʛyʋ͟ʐܼрܾӜʻȇۮ״˥ů݁ջıȵˬ݇ץ͙պʃՆ̨̼żʪʰݑЦݔ˩ܕݘɟ̿Ħݚ̢ݜƤʛuĉ̆uŚəڝ۬Оں۹ܜĂݱݳiݵͦܖƋŨĞ܁щݿiݴĤԂԙ܎ԜբtSՑڪ՜ފތӴ0ԥƫܘޒޔƻԉͅ ٕ٠/œݲދށĤĠ5˚ܱı̝ˀ̖ĢޘޫӋU˩ƳǬխ֠ΛčDŽԷцɒ֭ڼ޼o޾ףޜѥǚĵ֭ҧ߇߉Пǹʬҹ߅ګߑc޿ЬۚȒ̼ʄӭڡƖߙߛޮРՑ1Ȼ܉ĬߤҒԾސ2ūߏԡ߭č6܍ėƺɓČޖݽăߵҟ߸ɨё߳ԕࠀ7گƋߺɆߡڻߘٚ߈ߚȜࠉхֆߪܒ߿ࠐߒȵҫȶƫҘߗۧࠇ۫Ǩԛࠄ۰ߣࠚࠒɁࠂԆǽࠨ߬ࠪߛɂߧěࠧ߫࠙޽ࠫȵޏۋࠦɇ࠰࠹ࠑծԘ࠵бࠡ߾Ӌ࠲ޚ࠽Ңࠖࠍզ޻ࡋԂߋĘՑ࠷ࠎࠢࡓԤԮԧƼࠅࡒ࠺ࡄԶɄȬ߄ۦࡉ߭Ն߯࠾ԧ ࠯ߢ࠱ࡢԵړȓũѢࡈЧࡲࡃࡴߧТ՚ȯ܂ࠩࡳݞԵѢۋȔӸޠŻ߽ࡺࡂ߉ࢅڸNJקۮࡱ࢏ࠒ࢑՘Тƚ࢕࠘ࡊࢄʍݸࠥ࡞ħݣоࡡࡼܟՐТ Ŏ࢝ࡑƃࡪʍބࢣѷࢌ࠸࢟ࢩࢳ\t؏xސࢊࡗұࠆ࡛ږ0ʕӋźࣀ࠶ࢍпࢲ՟ڞޕǽࣂࢨ࢐Ֆ࡝ࢌࢷ࡙ࡩࣄߝࠊߨɇ࣓ࢱࣜࡾǛࢦ߆ࣄࠤ߹ࡗɠ࣡ࢃࢺȉࢫࢶࣦࠏࢠ1ࠂѶ࡟࣭ࡻࣶࣕࣤǰࣙݼࢎࢹࣼࡍՉࡸࣺࢗࡣࡍߺ࡚ࣽࣳࣵࡕӌ࣬࢖ः࢘ʍࡕߺԹऎࣛࢠƚǹѮ߲ईकࡄञȸࣸɇ࣌ࣔखƼटȔߩɓऔࢲबदҋČȮऩ࣢झࢢӞ࡯ऀࢧहࢺƟभɞࡸस࣮ࣕࠌृƐछंलࣝ۶ŻषࢸलĐࢽޝޑөࢋौ࡛࣍3ࣩɨߎढࢲ3ࠂ҃࣠ޢɰϖָ̊b̄nɴͺצȰ־ٳĎ˔ʽ2˯ډŜ߭˳˅ӇͨżॺʐɈ͙ˑۡ׉ॼࡋॾ٦ϖEl؂בՑٮܯ4ٲ֩˅̕ ׂׅ͙ͮȜʻ˖ƭউůॽջ٦֞Ώœpuϑו԰։ްč0˔ٿܻ׆C׸ؒϖফভoϖB८tyώظؓ٨̋াীuΪmbݲؑϽϤঽϑϖG؄ࠐ֝خ৔িϤHؐ৅৛৉৕ϤKiϵܬ৆়ৣঢ়ΦLu৏ৎբhӬৢব৤৮ݵτИƖאmتǓҭॖօĻnԒॆĬ৾਀܄ǧਃࡶਅਇ२׎ΦWΊdϪekŮ8ʔ̘ٳʅ̨ʬ࡯˹קLJট঳঵ŔݭĘ̦̑ͤݏ־ݣਫdzਭʹ਩ͩƨݫʱষ͙SਵӜʪʈƨਫːעӜ̘˖ۮܴਊͶċͣ˞নϤLaϺɺ1Ġफ़লĎ˫̪͠׆ͮخ੓੕ীˊgu৵঻੒੔osী֢zza٬lĂ੡੫੭اϸض৑عΡ੢੬زΊفբa੶੣੒تώੳੵ੩৮੷ϖ৯ˊd੼েϚએ৓੻ث৪੪ઇغĊ͍κઍ੾ગΦPٚϑ-̼oনޥىReĚiĒɩٯś֧ਗ਼ߩছĚ޳׆RܾબٟىœhăĠуٯগ΀঳ˈ઻ʟ޴̢SCʃƳਾьਸ਼ࠕਐľṶ̑ԕ૕ѡʹۊࣈŕޠǮ૛ܥ३ϤJoտǹs৏rgɈܯ޵ਟ9ਡƎਣਫ਼ਥĨਿӚ਷ਫ૕ਾ֍ઢε૪૬૮૰૲ઘsĈӼخଇˊଉݲଋؽ؅؅̀૔uઓěɁ࡬ࣈҘࡨंޔଜȜւ8۔ڕФऔତ͹Ɂࡵлקଢпଭଝȵےନॐ࣊ђșܦΦKտrϑumযȼૉ֪ɪଁଛ͹হݧĢʪׂʉż̀׵׆תخୀŔୃmϖę؅ƳT઱sǓ߁ॊՊȣिƖୢnֶ୥ࡕߟٴƽࢂĬ୬୮ȃଟߕɟ୳ڼ୶୤ȃࡵ҃Ȯࡁ\t୾ǢऻૢŻ߲ଳୡୣஇɧߟࣿࢯ୴ăஆȃࢴŹɞ߲ਈகஎ஗܆ŕऍ̷ҧ஖૗ॊ୻ज़஍୭୿஦ڧۭनऔ஥юǥҡл٩ԒனƃலЬࠔڔ܏ࡰ࢞஻Ȅ࢒शࡐஔஅஞȨ஠ɩࢥӮ୪୵௉ࠬ߂NJࠌ΄Ȥப୷ȜअवࡘȘۧ஻࠴ј܀ࡐௗ஺௑Ӊࡆ௝ӯࡉ஻ٵݖૐաख़ࡗ௎த௧۾Ʉɞஃŭ୽௧ӚՈ௜ࠗ௞௬௉Ԃॏ़ఁ௫ं஥అ௓ௌȊſ௵஫İԂȢࡅஙक़ޓࡗ̡ఉпఋĢక0ӊܡޟచŭƣାΡ୾ʠЭܰਟ˶݅୔˰ޛʔҖ\tʗ˅હʈߩܴ஥݂"); _this.parseZones(ret); this.loadedZones['antarctica'] = true; ret = utils.lzwDecode("Zone Antarctica/Casey\t0\t-\tzĚ\t1969\n\tĢ8:0ĖĘAWST\t2Ħ9 OĊ 18 2ĥ0ġĢ11ĺė\tCAīĭ010 MĈķ5ķĹĦļ\tĤĦŁĩŅĮľıij2ĶĸĺŒľŀĘŃŘŇ2 Febĸ1Ĵ7ĺuŒŔħ\tŗT\nĀĂĄĆĈĊČĎDavisĕŁĚzĜ957 JanĴ3ŒŰŕĘDAVĬĝ64 NovŒŵƉƋğũūƕţ\tƙƛņ0İIJtĴŞŐĻĢ\t5ƬƮĬřʼnŋrĴʼnĮűƫƗƭƚƾŇŮƳĸƶŠƹƻLjƽņ1ŨŪŬ2ŮDžĦŲƹƖŵƽŹāăąćĉċč/ŋwsāƇĘƦĝ5ƟǙƓŒ6ƬMĩNjƱśƴĵŏǑĢǓŵǼWŸźăIndiƑ/KerguelenDZęěǴƸȅƬTFĬǤŻǧžǪƁumātDUrƄlș ʼnDzȞ947š0ƬPMƜƌŨƐƒ14Ƥƈȹ56ƠƢȽƼȰȥȋżǨſǫSyowaȜdzƌƎɅĸĠƹ3ƬSYOȥRuș\tTroȴư5\tmaxŁǁ\tlđtSuțĿǞĭŀCEī\nɬɮɰɲlư4ɶɸŁƳɼɾʀʂűĕŀUTCȦǦŽǩƀ/ʍɳƥěĮ0ŎǷǗƤŀʦʏ%sʠɕȩʤVostokɞɋƎDecĴ6ǹƬVOŅʵȨʣǫRothȔɝʨƊĝ7ɍ˂˄ĴŒ-ɦLjRɪĬ"); _this.parseZones(ret); this.loadedZones['asia'] = true; ret = utils.lzwDecode("Rule\tEUAsia\t1981\tmax\t-\tMar\tlastSun\t 1:00uċĥ0\tS\nĀĂĄĆĈĊČ79ċ995ĔĬepĚĜĞĠĢĤĦĨī-Įāăąćĉĸ96ĐĒļOctŀĝğġģĪŇĔŊĂ E-EurŎĴčďđēĕėęěŚŃ 0ĪĩĦĬšeţťŧũĸĶŐĻĕSľřłŜŶŹňŻŽŦŨijŐŒŭŕŗƈśĢƋīƍįżĀsijƀČĎĸ84ļApęďŵŷŅīĭƞ ƠƢƒƤďƤ3ƖŘƭƛ\tƝŋƴuơĉƣčƨČ9ďƅƇŲƉĢ2ĪsǀŠƳƵdžƷčĻNJnjĖĘƘŴǒĦǔưźǗDŽƶŏNJ2\tonlyļŰƘaŘ23ƯŷƲǂǘaLJ9ǭǯDZļƆĿǏSǶ\tǸŷǁŢǾȀƻƕůǠȈǢǓŸƱƎȐǚ9ƻNJƄĽȇŁƙ ǣ0ǔȎƟǩǙǫĹƔŔĕŖŘȖŜȧȩŠZǯăũ/Kabā\t4:36:48 ĕLMTċ890\n\tɕɄŹĕAFɏČ45ɔɖɅň\tɚT\nȺnȼij/Yerevaġǒ58Īɋ\tɍɜȁ4 ėy Ȧɠ\tǹɘ\tYERɻ57ɾĘʃɗ0ǃDžǿij ʈR%sɻNjʎr 31ʁȷʃʅīǦʘSʜʢȆȦ3ʥɷȜŏAMʚʜ5 ʭ2ɽȦǓʐŷəɎŐ7ʿĦʓǪĊʴʶȋ012ʞȦʸʽǤ˅ɣʴɦƞɤzɮ˃œŮǟűȤŴʑșǧŋ˚˜NJ7˞ƼǡŜ5ȍȹȻɤɫBakĨǹČ:ʻɸɺĸ˽ɿʣʰʆBAKʋʍŰ˕ˇȭa ̆KˋǝːʡʣʾɕʄǺŹ̑ʪŐʢAugʠɓ̙ʦ̍ʕʳZ̓ĹˏʭȈǶʮĪ˕ƩZʜ6̴ōƒA̫ʛ˃̴A˛ę̼ʶŻ\tDh˷Ċ2ĦķȃDzĕJŃČȋʦ˥Ǽİ͈͊ˌ0͎ǰ͇͐ecʄďʻ˱ʼnɨɪĉ/͚kĊɇˍɈʒɌ˂1ɑ̥ɕ˰5ǹ͌ļH͵94ʢȳʃɇ3ɣBUʊĸ4ˏ̂1ɟ̙˰·ļI̞ɝ̮ľ΅ɢļΉ΋Č5ʬľ̤ΛʆDACɻ7ʢŰȦ̸̙ͰΈDɏ͌͝ΥīͭĊBDͩͅ˴ͫThimphĨͺɶɆ˾΀4ʍ̡̣ΐʃΓɣΖɻ8ʍ΄ΰˀ\tBTɏɧ˳Indĉn/C͉goǔɄ49Ͳļ˿Č0˄ΒϛIO̷ηΕϹϠɩοa/BrĠei\t7Ʌϯ4ͳɹ΀26ʞʃЉΔĕBNɻ3ʯ̙ɶ̅ИϾͪЁRɲϪǯ\tɇͦЌϋɜ88͸Ч˼ϭɣRЏЯΆΈΊɻ΍ʎyʃϯʆJΗ΁ʸ̂ʠΛЕĖ˂͆S͉ngΌī͏ļ͒ŜƻƿǦDыэяɝʧ΁Ǟȳńǀ˱͘ăьФΌďђȔƬŒїŷљ˙PRCƦŒѫǟDz ƨѯŹѱ˧ѳѵƤŒǝȅƇś>=1ďƿȚѲѴƦ˫҅əƫĬĠ҉1Ɯ̛θРЀ/ѧю͉ЇН˰4ƻʹɻˍʃНƱћ\tC̬Ϯҫŷҁүν˳ȽUЄmqЇͺŶͽҨ̀8ϻĕXJ˘˧HKѩǮ͟ƩҕďǹΔǦѥ\tӋӍѸȆʄīӓƜǖӊӌɝѷӏҔęͽӞ͗͆ӘӣӎȄĕD͢ċ̚ΔȪӗӢ΁˫ѸƪƬƻөӕӫӸύӮ͠ӱͣΔөӶӬ΁8ԄdzaDzǭӿǻԁΌԍΠѠƗȵӴӟʼn˙ԋ5Ȃӥ\tѡ2ĻԉӠİԋϮĸͻӐę҈ҊԜӪԟӸԮѸNovӳԨԞӡԭljőƨѬҖnҘԍԓŹӖԠƨѸѡʡԳԊԶǜՂļԹԻԱӒΜՒĸ6Ք7ŒӦՅҘŒՉҎԿČ՞ƁաԤƗՙե՛ԩăԋ7ƻѸԆӜԳԀԵƁ͞ӯѹգ=ՈΜջը9ƂՎծҗҊհӵ˲ϿȽHǯg_K֓ЈɅɇлӂϳɽȳΤМŷӘӋұʢԆˑоϛскʸʭϑ֡Ź֣̒ʛ͆TaiwɲΌӤտɿċĻѽҜ˙ֶָֺӭ։ƽѣƌ˦İֹׄġɝӺԣӼֿ׊ʧѰֵַ׏Όגտ՗ӳҍ׌ă׎׆ԌԭǞ־Ҍқ͇יׅאצԘ˭ת׋ӖפׯԡԎՄ׳חѾ׭כΠǭΠՃ\tן׻Ǖ׵ךץԮΠķբ؆ј׾؊Ք6ԙ׉ס؈׮՝ўؔѓ͓ז˥ѿ׍؉ׯ7Ձ7ȡה؏ט׃أƁئȡѡ؆էآؙĵվ͒͠lנ׫ءףحض׹խؖѤҝȽׄpІ\tНαЫɐő Jɲʁ1ҳрWт3Ϙŗٓ֩ртɞʹΣ2ʢŝĦٕī׶Ҷִ˙ėcaĨթƹőǭՄկպԔ٬aٮٰőٲ6؃ןՙՑղǟٻ՝նԣǴٶׁעڅٯ՝ՍډǠٶզڍ٭ڏթĻѸڊ֋1Ѯ׫Ӗڗټժ׈ͤ؟Ӷڢ՝҄ևǞהڔքٸ˧کթګΫ˭گ֎Ծİڳև؁և؃ڮڝ׀ڠ͆ڼ7ھյڷۂڧڄۆئ˫Ȳ֊ՆҊԧձںăۆ՟ېɤҕՙەӔڱڻٺژևԗč˖۝ۋڌڡۣټ7ۦЮۊۓΐیͨҸɫکДɄٍ͌Čˎِْģ٧ڎĨMO̬Ĺ ֧͌܃ҵҰ٫˧CyƫDŽƁښדӑіۄ˙ܒܔǥևܗտرǭסۗүܓЄܟՠفשۃŹօİܝܩիفرزڄܲܕĵҒۧԯցتՊܹ͆ܪם͠ӛԦ۵݂ܨܺۥܵƗܤͧ݊ܞս˝ǍȣųġܥݒܳƸŐԍՄԛ۫مɫNicϫŏǒ1ͼɊ֜ȁʢ՗ģ4ʃȧܧݓEE܈ɊȆݴŷ̺ŏݸͅLinkҞݥݧƒƐoو/ވݨaݣπbiliĈȋ:5ϯҋ۽ЭЯɴޜǞTBЏɽх2̄ɣޤỈВ̙ʑ̨ũ ެ܈άĘʠ٤ʤ̦׫ެтʝӼʁ9ު޲ʖGݹ̾Ǭ߄ŤƐƀ߇܈ɽ̯ˢňߌſƒߏ߉ȯ ֟ȵ̴Ǧ߇޿̊޸ߞްɷߖƑŏߙδĦɽєȦϵɕ̧ʲĊ߫͜фߤߓ̗٦ߦʆ߇ɦξȽDޕң˼ǒۼݮۿّnְٜޫLкˏFebȦʢȌ߼ɕпɣ֫Ό֭٢ЛࠚϛTࠐիмʁࠡيϛWޭA͜ʒ֮ʍƮ࠙\tࠛļࠤࠀ۷֖ͫlͮtĊͺݬޞЮϒޚͼɣͿк΃ŗчиΟ΁ΎԐģΑ͹ΜĕϕΌΙpࡅ۠Źࡘɝʸ֟֯ࡕшϕР Ƚّͮr࠿֘ϴ:ۿ֜86ώ̢ģЯЉ࡯ˎΝЏ3܊͢޹̲ύࡰީ̙ЉӁ\tJAVЙˏ՗Гࡖ\tࠬB࡙ːǸٟٝࠜࠟpʮ࢐ш࢓Ԗм܃ĕࢠΠʒɿ࢞ɣࢥՂ࢐ʆ࢓ࡧȽPǯtϥ˷֘1ࢇɣϲɒɊࢨࢆࡰࢹļP΀3ࢎԺࢩļࢫлࠋȦ߃̙࠶࢚͑١࢜ࢗࢿ࢟I࢔ɝࢽԐࢣ࢒ࣘԭࢧࣜࣖࢪࣟթݳࠎࣉ࠭ƦɊ࣌܂ࢿࢮࣘࢰ۸͊ơǠЉʌ֙۽ȁࡸޚДլMࣄࣆvࣝࠬT࠮Θ ࠓࠕ ࣓࣎ࠢٞ֬࢝ࣨࢤࣲّ࠭ͫyapŧĊϯ2ǒɉࣺࣅ ࢏࣏ࠫޭΌߑΣ࣮ࠢшΨтٿࣩ࢘ӉİIrץۯƦɣǴ٣؟ؐ˙शसԍڥऽؗ͆ुؤط҆Ŀ͔ॆीषׯ۱ӚƇǸیӖै̟ܬԐĢܚܯث˧क़Ǭƃԏӧݐफ़׽ॏץNjॣݖȋ०ӟॗॐƓग़ӧׂ݀ॠॲNJּ݆ܷ॔ॱ४ܼĹ।८ाय़वॹĹঁ؍Ȣ঄ॎॸֺεёڒॵঅ२এɳĦ঒տ݇ॾेॲεͥĦҧˠ঍ؼঞঐĦড0ণ݇९؇ধঘ0ڑֽǠॅদ३঱঳ॼĿশ״র߷ॴথ१ॷইন0ܡ঻ূ॰িεृওȋॶ׬স͜ৎছॽॖৌ͍ˌҋঃटকৄăक़εķ͌ড়७৞঎৅ঘࡻڛ঵৑ؽ\tৢˍԢ৖়ঝ৓৥ƻ৥ȡ़মिগ৛৺ˍȡভ৘৸ˍॻঢ়৯৙ڞفজਆ਀৥˫৥ঋ৽য়৒਑ˍਓˍঋਅ৩ৡট0ͽ৭ঔڌৰ৲ਣԣਏਟৱਡऽ͌ॕՄ২ষਙਯਢব॔মسਠনʻুঽ׼ৠਭ਽঺ो৐ਐ৪ˌ݈ਰۛਖਦ৙ੋਢۛਞلਇ2ԍਰਕ৮ਗਧਮ੘ਢਝৗਬ৲Δ͌Րਲ৾আ਼ঘ੥ফǞ੔াਇࣅˌКਊੜ৙ੳ੦ਸ৶ੈ੫ੴƨ੦ৼ঵੩খ੉੦઀ফ਄ਹ੽੃੬Ȱ˟़਋ੲએ੆ੀযࠁɫTehॲͼҥ؃ࢻڞʰԦɈ؃Tόί߲࢑IRт7ʍथɡ࡞ॲબ̬ĶʰΔक़વܐ৅qƦ৴͠ש੷३ાƤھƧײઌुૅčڈ঴ęՐ੏ૄƦՁ8بӑૃএૌ૖Őɣӛԛưȸॿ૛ګɒঃૠȘ৿ઽख़εۛהģ̚Ǥؠধૌ५૭˭૰ʦૢޒЁ˶ghdadޙࣸЌϱ͵ͷݽࣸɆࡼɻͶުƩт8ࡑн޼ળaાAͅ˙ZiЦѝفєѢ૒˧ଝଟࡐऩՖԺଣ੕ଥଞׯҦف૯ͥ਴İଦର੅բ૰ତଶଯࠞଲӑڟৃਘଽଧɞفן૰ݵ਻\tଷֻୀѭޙୃৰ୎ׇԣ୉৷ମ୆৕ુज़ॕƿݵD୔ାࣚ਎Ƈ଻ଵă୕װ΁ঋ୘୒োଜ୤୭ग़Ѻ઒୚׷চ͠ةୂੁୄ୪୳5୺੆۴͖ୌ୫Ρ୐ବ୓͆ஈѪୗଫড়ஆڍஈીܾͽݵ૪஀ଧ׸ڥ͔ஓӖஈ૎୻ӑǭங੪୍஁ண஄Ӿଭ୅׷ହࢉ͓ढ़୾ୣஜறӛࡻਬஈৈ؝א଴஌୲ஜ஽७ড়஻஁ਉ͑Ŵழ૳ூ׷௉ঌԈம஛׷݅஗৤୩னஜ௖১਺ஔ୳إଡɂ ˫଼௔خݎƽௌஇ௠௄ۜӧҚு୸ܖଲ̢ڦேଧ૜ӻӑѼ௙୫௺ਪƇ۴௸॑ௐשԍ௦௚అ୦Ŀ௤ઌ௿௜௯וఉఐఌċ௫௟௹ଡ଼ܾҙ૙ய࣫ఖѻఏ୳ɑஊӵ௾తॊ७ʠణଧ૦ਤȋܮவ஍୳యד௶Аభׯ५రਾఔవஏ৵஋ୱ௳ॢఽķిమ஖ఫ୽য௎Ő஫଺઄ੂ୫Ȟడల౎౅Ĺறଳఞ௧NJ౜సఈ௓ఊॣర૑నమ௮ӛబఄॳరః౩఻ௐஹ్௬మ఑ઑ౞౥˪ఖ1௽ੱౚčਿ௱ళ౏NJఛౌ఺ŐపఒȦ୰்ಂ಍౬৺౤୎঑ஊ౿ಐச౥ಘڥ ҄ಖାঠஊऌ˥ಜಗ঩ఖਾǦ౷঱ోত2ķǦನಣĦರѡఎಭఙ঱౑ಱԗ౲͜ಾಹȟಢЦε౜ҕ಺ುೈಫ؁ೆ঱௮ౝ஧અ௧ε௮ಹ௘ಁటεŒ৥ऻǠFri҉హ೔౔ಶ0ௐಹீౄ೜Ħ఑౵ಐಮ৔௩ĢĻୋ಼͜ಓ॔ਓ೐৛ஃ௅஦೿৥ుதę୊ೌˍആ૸ഃ೛ೖ৳ুೢ೤=೦ഊ৬ఁ়ಕഏಝˍȒȱতഓ೥ഛಆ௳৹ˬۑȴߓೳźઘगɮDŽaĂmޙ͌ޚɽࡲࡄ̙ࠇŶଆ͑΀ଏ഻ŷ୎Iଛ˧ّpץɉ୵ܿಛநൈൊۦஉ७ȉt҉੘౤൐ର಍ہ۳ൎೕࢉच؊ў൓րڂ೧׬മЁTokyo࠵ࡰɶޛଇЬϗࡿcࢁΐŞल࣑Ьُ࣭ٔदрC٘ٚtࠍऎī൚ࢉെİJorଁؤಾଢ్ܰăඐඒसȟܠૉݚ˙කඓ௨ܻԏDz৑Ӗජसௐ؅݉ඡඑඣඥஞථേධूదಅԴඵඛؤಉ௑ඹӶඪ॑೒૘ݢද඼Ʀ೘ƗܷܦෂѶఠբഢԲෆරනč૥ɣѡි෌͆෎Ƥ಍־ౣୃඩබ఻ഁఒ2௥ܛ෕४ഌ؎෪෣ෝ෥ख़়॓෰ԝෲ෈ెܘƬඹ඘ࢉෳॢNJণේೣҘපඏกĹඝಃෑฆී෫ฉ෺౛ఖෛౘශชĺݞ੆ถזȸ෍น಍عృǥۡ඙ม͜ٴঌǏഓพǕภ෈ಘತݠŁρŇ૩ฦ฀ัಷ৛สǴǏึȋˤ෿෎εೃݏಀȨฯ෹ඣ್ஞలฟ์৆౫ǎŁอƛ๑෇ํĦೞഋ˭ฬೣฮธ฻ݫفոͽච෬৫ƨȓতเφโฑว๤๬ഠѡ๠Ї๘๋൪/Amđɳ˼ǹ4സЎЙංɕݵ෎ށִ๼AlđtDz˰࡯डݮ́ࡒʂ϶ʆAࢻ·ِĠࠖη߅ĉࡨɍ޶Ӆɤࢻȁຣߴສʵ̾೗ːࡣаຜɺૼ/QyzylබɃ˼ĤԡࣺຘʀບલɣKI̶ĸຟ߯٣ࡅʆ໊໌Ƹࡨƫඉ\tດ୾໓଒ࡋඈबີ້໋ϖˏ߁໠໚຤Ċ໓ຨປ໢໔Ĺ֦ࢀઢ໭ļQY໯ȁ܀ࠌČ߻жʱȬ̩Ċ໶̽߬েຳࡔ໡໵໷࠹֐ɫAqtobă຃ɶാຆ̀ާນࢅ່Ʃ̈Йʒ໏ຈ໙ϛ̇ϞƦ̠໗໧׫༦ໝߜٛ໠α༞༧૆໖ʟ༫ˆຮ༦໬ࡕຜ༟̟൸ģ઩༤༹ༀƀAQTˋາέິ໚Ʃཉ༌С๽༐ڏͼŅઠަࠧ໇ເʆFOࡏ໎ມ໐໴ĕཟࡏ6ࠩཏƅHEϖໞ໘༲ཬ཮િ༶໘໨ຮS཭༼ང૞཭ʫཁ໳༽ʒ༺ཉ܈߸ʟȵ໽̌྅ཊັĦྈࡓ໑˖དຸOषغઞб൵༙ཛ༜ཝɣΊA༠ຠࠌཤྃļྡྷ཯ྲྀ༸୾ྡྷ༮֟༱ϛྪཱུ໦༣ླྀཆƒྡྷ̬ɑ࢖Б˓ЯޱຮྻߚNj̴ĕྴ֧̔ྂྠ໩ԤRଚྏ༆ཌྷ༈ཫ࿏ྣ͆KyrgົŐھőܾԱ෷ล݁˙࿚࿜࿞ขȯ੆ݡݑ࿧࿛࿝z˝೗૧ഫǒ࡝ୌ࿨࿲࿴߭๟࿷ຸۖBޗhkeކɄɵбໄ༚ໆྟ࿖FRUྤ༢ອྐྵລထU޶̕޺̘ྨǦမ޿̠ࡶ̖࿀ྒྷ\t࿻࿞KGཋྐࡨࡶˎຩါऴăROԂ඾ଢ୨௲İံး౾ఘӖှΌ൜ೊௌಜ၃ɝಳĺ੯҇֋෢೮ဵ့࣠ಥ୷ွၓױ৭Ѻ඗ந၉ĺ௮־ ౘ၈ၘၟడై౤ၞ5ఆ୞෾ၝၥၫఖధജၪܼ6ೠDzڂఉၵؚ੆ՙၐౙၗӸϗැ൦၏ൟੂၞႄƤݟقցփা๼Ɔoɂɶ෩ޚสࢻ0ɊྶҳшKтࠊ܁༣࣐ࢉඅЙඇ໘Ⴅࠝࡠऑ ӄඃ້т5༚ʟྦྷࠪΔ၃ֳɻؔုϐЯ࠶Ⴚҷ།ͫP൯юङюࠪ࠘Ѝႚႜ༪༣ωႲ଎ˏඁൽႦආ༯ໟႤ֪࣒ϏȦࣧඊļႠ߬ΐႾࡓŵƛ႞დ͆Lࠔɲଧ਩૏ȋႀ෿ხbჰׯჲ͠ԥทڄჷჹ̀෮ఒ၇ูᄀnჱᄃՏจăᄇჱರ़ၜ࿦˧ᄎჺಸƗႀӶᄕ̀ಾהਲ਼෱˙ᄛČॕ෵ċ౶ჿჯᄈ௕՝רज़ඨჭᄩ௛ᄬඟ࿯ᄔᄱؤರଢᄟ୾ӖᄢڽƁۛرᄌɹᄷƁඝયඦػᄠᄶჸᄪƁ඾הၳᄼᄰᅍଧहᄥᅒ๋ᄡᅅƤ૕੍ᄮਗᄽᅜLjख़ഩᄦᅃᄾЭ௢אᅡᅔᄁෟൌఝුİᄾ૦ॢȔටᅭᅛᅕ఻ᄗŘ้ᅚᅌᅯซന๮ഫᅳ쨔ౖಈ࿭ᆇᄵᅴᆊķ๭๷ᆎ׋۶Ⴤ૽ІЄǷࠆɷഹޠŷᄛຌဴ؄Bඑɩ൰Č3Ք΂஄ᆀӀ٨ӖNᆦrᆨໍᆬǞոಚݚͩࡨɫKuലa_Luτŧа4֚Бݮˍ໺ཱޚ˰݈ƅ΀༆߯໠ࡹऻຝЙࡾზ࣯ҚͽMຝ٘БᇞɕࣁůᇛѩႮ༣ДᇚࠥईऊགთႬуऑေࣣdzᇪ༵ᇦࠪʆMYϟᆽȽᇀcς჊ࢇĤ࢈ࢻАޯᇧ࢑Bའᇜ܃ᆳᆧe൰ሑʙߚлᇲ࿌Ⴋ࣒֮ྟҬΝሒཱུᇽሣůሁҝϢϤɲ/ėlϤveϬഷᆞ༘ͶഺɡႴϛऀႼЯ࿖Mࢌ\tۅ֓oغƺ૔జᅺڲቆቈ્೶ො٬቎෉ปิݘቌڻቔᅝቖหᆕ෸ቓюቇ͜ᄃה̰ᆜᅋቚቢغತೝᆍŚȊ೹ܦMቔε஦๜࿶ተቨᅓቡϪቬਃᆅ฿Ȥቱ๲Ėትኀ๭૟ኃŘᆼ࠺Ё֒vଃͰΆᇌሸɒʸϏຩHOቃĵႰሏŹቴቫӗኜჃནUěɲჸǶ޸ࡹДˏᇍኘ̢ࢭྡLྣᅏ܃ኢቾ\tU኶ኦҞϨoiჸlsֺДҬࣺ༆ኙᇟྩ኶Ϊኟᇾኵ኷ƺ༶लኺባCኛိႛလኹቔዚ܇ຍ኎ȾǶh຀dχɈĤڞໄቀફ଒གྷҥȡNPϟƳP˷ޗ࠿ಯஊԱ౓ע ዹkዻ৆ᅾց௞ۗጂዺĝ৆္؞ᆈጋጄግ঱੟͝ପԻቒǂጃጅ঱၅ƬၣԔ๼ȿषሆЇۻɶࡱኖϴ࡜ϔٟ࡚ጭ˥࡟ᇶࡢ࿕ደʋ΢࢜·ဧĕKAࡏΫ྾ྒྷጒጝ\tPႻቄƳE࿝ptLJʌᅱၮᄓŢፋܓፎǚፐΠႍ೬ᄌţፌፗȮɵൌျቼǂፕፍፏ။ࡴᅉ૰಴ฦ፞ፖ፩՝ઊĿ௒ᆖƎ፧፠Ū6೫ƗૹᆏżዹĂĝބăNJ৤ྐܾฝ጑ᎂሴࢴϿᎇೂ˭ᎋᎀጋᎃᎏă๎ԣ፜಻ጊᎍᎄϿ࿵ಟ઀᎕᎟᎘͜๝ϴܾ፤යŢᎦᎅᎨ೎፝ᎯᎡ೰ఖึൗബ᎞ലᎎᎰ্೻ቹt๗๲᎖ᎽᎵႛడጚᎮᎼᎠ᎙৚ᄥෛ˥ȪᏅᏍഀਿᄒ਻ᏔᎧ೟௵ќᏊᎁᏌᏛ๞௻ഈ׳ƹ፯ᎴᏎড়ӻ௶ᎬᏓᏩ৛ብ௶ᅙ඘ᏚᎾᏣങչ๩Ꮛ᎗᏷ࡻ৥؃ኂĝแͦቩᏠᏽᎵഘూऽ᎝ƎᏰധᏐฏખᏯᏡ᏾๵˟ฅഔᐓղ᏶ᐉĻ๭ᐂᏂ๡ᐅᅓ๼Gaz͋ࣀ႘ྜϳʒϙຉൃାݸкࣛʀິȧ፰፨ފ߈Ⴜʍᇗ༈ݵൄ܈གྷຊෳᆣಌݽˆᏰᑈ্ყಲʁცൂʆᐴ৔࣓ᑊʒᑌᐽഀᑘļᑕ೟࢖࠲Ƌ༣ᐹᑚိޝჟ໠ݵĕᑟ৳ᑘᐝŌᐽຸHࠔrೇ˼Ӏণႚᐯࡌᑓī୎ᑕࣚࠧᐸߧ፟ƀᑈթᐿມၢᑝᑃ࿅ᑅŷ຋ᑛᎇᑯᑦ઼ăPς቏ଌԸ஑቙ᒘᒚໍ఑ऊᅊበҀᒡ؂ಙጀӖᒙޕՀ௢ቈᅃᒭ቏ᅗ৏ᄻᎭᒠᒮኞಫො๼ėnޕĊ-ൻၫሷϲƧɽ֧ʡٕޱࡲ܉ΏბҴᒡPHұଔᇴٟɽ઱ዒፆᓓᓕዣᆘູኬૐ˼Ͱݭኖ܌߽ɣGમვĠଐəʪ\nރޅᆾͫQᓣᓶ૽aજַߔ๼Riङdh૱ɇໃݮύຳს૱˖ᓲᓴkᓺ/ᔁᔃhᔒAdeġᓳބᔑȽᔔଂᔖሄuֹitຸSބgचඑăᔇᇒʸᇍʢᇽᔯ˼਄ᇕʸᇗᇭሽᇻȞᇝႣኴѣᇡᇣЙᇥᕀࢿ࢈ᇢᇰџᇬࣈᇩᕋሜࠔᇳႱѓሠΣᇸሏшᕊႼኲ̣ऌᕎĬG໤ᇏ໠ረᕡདྷዀቇomb൰˰˻˽ᆟࡅ˻ੳůᇕዲጷ࢕࣭ጶధહHጯᑗ϶࿹ৱ࣒ࡢ྿ȧጱࡗ޿Б̂Ԧᑑ̳ϚшL̈ƓლήᖏጻϚʆᖓ༅Б߁ღƮᖙࡤጮᆤS࿛Ȯͽᄣণ൝Ҙ೸ኅᖦೣŪᖩȁคےงቲыᖧ፻ರᄞ೚፥İᖰȮ6ጇ೭ᆁᗀᖺڇ፳ᅉᗅ෿ᗁ፻ಾӛ੥ᎀĬᗈࣦቑᎺᖹᖱᗊᅘīᖸ˙ᗎڪஊਾ൨ӖᗠڴܴᅦᗅӶᗦőܼहᅸӳᗤᗙȮᅈᒻ௅ᗘᗟᗕቐቜբᖾᒸᗔᗚ቉ᗼႎᗪڄᗬࡳفᒤ਍ᗲᗹᘁ෗೶ᗾᗫᗺႄ౰ႈڍᘇܼᅪᅦՐᗞ˧ᘇ඾Ǵ۴ᘌᘞᘓ෠Ǡᘜᖯᘥᗗᘝᗇᘎశտةᘖᗥᗺᘯ৉ᗒ፷ᘍȮ఼෼ృᗿᗬ५ᅷႎᏮᘆᘴᖼೊჵูᘿಾᄑᒟᘀᘺᗐ॔ჾܦᘿՁ࿡଺ᄯᘹŪ΁ীᅦᙃᙓᘴঁႍᐡኢᙍᘿᎈ೪ᎫᙘᘤᗚቮᄥᒷᘒᙬᎶర๸ᙥᗈ૷ᒝԻउฏᏟᙎ͋ĦᅐҕᏑᆈᙽ೵ᙸᒥᗆѦᙶᏏ৏ᙴᚃᗠᏜഅᎊᙻᙵᙱࡻᐠȕ๖๡ᚎᚊ጗ᆓԚᚙ๹ݑ๼DađscܕࠇᕯኰᓨᆠՊᗈᆣຸDDŽэ༓ເᆫࢄဌྞጼ͇U٘༡ལ༣ٌߴ܊ᚾရέဥ޻ဟѰᚾဢႮ9໽sᚼTӈቄ๼˶юk൭ᇉǣཙ൶໾΍ĥ؃ޥɻۼӼᕁࡗΩᔜᓵȽᛘgᛚᔞɫᒙᄈm_Pᔚᔅ᛫ᛱͫᛮᛰᔒViᔚࢴɲăຸćhᔫჸŘǹͻɅᚬሌဍ̃ᓪ଑Hနᛁፃ༺ེᛇ޸ᛉᖐ່࿎A᜚࿅཰෩ྌဗĊધ܈ვْ໼ဦཥ\tધᕨࠂuჸЇ຃ዬᜏе࿇\tᓬɦᔐᔒᚳ᜵ᔒMDŽٮŘᔨᚥĘͮϣເ႗ͻᚺި᜻S˗ໍᛀྦྷϛᝓ΀Ďྫྷ᝘෣ʴྰ༰ᛂࠣᜡᕣႝ໭࿎᝚ရʭྭ࿎U༄࿟ᚼᝯᜲઙĜစᜂᚷЉޝທᜑཛྷ࿖आᚿྥຢᖚ྄ᜧᜰᜡ᜛ʟ᜝࠴ྸʔƀកᝫफ᝞ចណྺᝰߊᜯᝳख኏o_Ϩi_Mބᔅࡹ֚Ⴭᕷຠl໘ឥ࢑Pડ޷ໆᔻʆIΩ࢕ᓊࠗʦࣝIγࠞᔋ̲࠴ሟऐᝬྟᇙΕ឵ב᝝ឺូΠᔹāឫϷះĺᛐិឿЯᕦុΪ៍໻ࠩៅᛩT"); _this.parseZones(ret); this.loadedZones['australasia'] = true; ret = utils.lzwDecode("Rule\tAus\t1917\tonly\t-\tJan\t 1\t0:0Ě1ĝ0\tD\nĀĂĄĆĈĊČĎĐĒ\tMar\t25Ĵġě\tSĥāăąćĉ42čďđēĕėęķ0ĢĠŌģļħĿĪłńĮēıij29ŋĢĢĻĦľĩŁŃĭņĺepĴČ2ĸŎĢĤšĨŀ943Ŕ4įř\tlastSuėŭŏşőŢŴŶŖŧOctĘŷƄōĸĤZĎe Ŀtralia/DIJwiʼn8:Ŷ:20 ēLMTĈ895 Feb\n\tƻ 9ĸēACSƱ1Ƴ9 ıyƺƼƾ3Ģœǁ%sTƇĄWĪ7ŹŦįƍƏŽſƁƃġŀƔǕAǗĉ7ĶǛŘIJĺƂ>=ĚƒćƆŲǧĪ8ŷǬ\tǝżžƀƂŝǤŏűĽǖǹǚŅźǮǡDZdzǣĹŠȇǸĉĊƋįNovĈŬȑůŐǷǨ99ťȋǭijȎDzȃȒǦǗƫ06ȘēDecƐȬȠȆŒȯŌŬŌŜȨǿǠȂǴȭȢĴȾɉ08ǜƎɃȁǢŌȄŰ\nƖnƘƚƜƞƠPerthĘ7ƨ3ƪ4ƭ\tƯDŽƳƵȵcNjĘƧŏǐWǒDŽŵ3 Jāɱ ɳǏǗǧɷɖƗƙĆƛƝƟ/EucŽɲ:35ƪ8ɩɫƲƴ ɯɾƧ4ĶǐCɶǓŔɺɼlʝƨʠʂʢʄǷQǘĚǼǾǟɑȹǥʯǘȦŗ\tƷbɐǡȬǶȔʰĉƳĪȗēʴȀˁɆȺǦ˅ȤōȤŃɂȪȐɓɇȇHoƞdađȖŃȖŷˊɏʵˍȟʸ˛˝i˟ˡȤŷȖŹ˖ǰȫɆƆɗəʈɛʋBrisbĖă1Ĝ1ƄʖƮưʙ5ɱ̆ĸǐEɷʱ̏ĜɴʰA̓Ǔʅɘʇſ˽ƠLƥdemĖ ƽ:5ʔ56ʗ̌Džƴ̖̑ĩ̔̚ǩ1̴̘Ą̛ɸȥɻɽƻĈ̗Ģ˜˞ˠ̽ʮȔSʱǹĶ˦ǞˌɅ˪ȅǦ͍ˆȲʳɏĉʷ͖Ƿ͘98ȿ0Č͑ˀ͔˙ˏ͠ʺȳʽƸū˂ĺ͗ǘ˲͐͢İȍ˶˘0ǵͳ͙ͬˈĢ˵nȏĶ˸Ϳ͌ˈʲȧ͹ijƑȑ˃Œ͡ȥͮŻ2ŃΈȓΓˈǻ΍ŻȞ˙ΒľΔȊʼΗĢΚʹȖ·Ō͸Ż˨ͩͽ˚ΜȰ͚΍ApŚͲΛΤɋĬΟǮαɒγΣĄ͍Ȱɍ̧xįιȩͻμʹω\tϋɎƏ˗͞ɕ˺̟ʉɜ/ḀŽˮăƾ14ƪƬ̋ɬʚʾɱƾŏǀǂϫLJljϮʒǏ̶C̸97̺̓ǍǏ͍Ǒ̜Ƿɸ6πʼǾϘˎ˫ŒІɍǼΰ͓τ;νĄЏ͏ϖͨДĈЍľІŜ̹ȌϏ΅=ɍΪЅͭǼʾЛϑЩǩͶ8Ě΄ȏЮȔɸ8ˣ͢˥ΎЭШзȉǹȲд˷ΑΉЎтͮЊͻ·͕ɕЯ͢ČȖ΃н˗э΢чПǹЈƌɏȪΘϙȡрˆɍѓКσѡȻњȖğȤɁǽўϐЌ͟ѣȤdzήУоцЖAƱȰĢǼągѺͪОЗɋĚϕͧЋюѢшζͮώǯХͼЕǦѾɊБςГжҏŌϊaόǀκғеΪϛɚʊƠ˜̃ɠ\tƾ4ϥуɪ̱ɭ Sũ̻є̚ǃĪ1̯ǝ̩1̩ƒҺНɴEDɸċƶƸӆ̒ϻЇӏƱ̷̜Ҩ˼Ҫ/Cur̀Ϥʒʔ2ɍϪ̍ҷҹ̓̐ϰ̽ҽĉҿ ӁęӄġӆȠ̚ӊҾ7ӍƹӨͅų͊ʤ̹́ʨӼ̑Ӕ̾ǦV͎ˆ͸ˋɄМͫȔԉǩʻŧЬѨпŒԒϼбίͺҔҝľԚ8ȲѦф1їυљĄԢԤёКіѩԈǹѥѮѧҜѳяԑ΋ˈ˴ѕѲѻԲάɋԝijԗՀǷԉѿґu҃Ն҅Ѵԙ҈οԶԎԱՈɋηʼҒҌјѼՉҙρՅԷՇԺϓҊĄҤ՜ԩ՞ɋҠҢѰϗԿՏϚʆҩϞMelboӜ̞Ǎƾ52̰ϫƵϭԄɴ̶̾̕ևǏԉӕǔǷNԊͷՔʶԸҎľ֒ԓͮЬ2ΡիǦ֚ԛǹгԾԟԘ֙ǹԔύթղ֑֠ǹԜѹժҖְ΁ˆѯŻ԰֨Ą֢ԣъ͜Ŝ֗Ѫֽћˈѯԍ֖ҍׄA֢9˓ƴֳֵ֮Ȕ׎ȲȰՄ҄֯וɋҀθՌךɔׅ֘Ȱѷͥ֕˩ճף׍՘ґ֧֭դŒ֒ȰќѹՎכײխϔҡ֬ФҦױ֩զ׼ҋדӇմ̞նʋSydɘˡ̗ϧցփӥֆƻөϸć֏֋ؖӽ׬֏̝˻̠ә˿oken_Hill̪ĵƨ̊ҴքӺӆǀEӬƳ̯҂ 23϶ӪǁظȤLjˠ϶ǎӾЃɸϽنǏ֒ىםٌχĄϺЄȇLH֤сͧ׷؆ף֪ٗЙԦŝδăٟԋ׀͒ՕƒěϷַֹٞ٘͢ԞΆ٣φ٦͢ՙѝƏ͝٫Ĝهׄٷׇͣרβ٬ٿǕٷ׏ˈיժ٤ɪٯȤחѸɂٜٶ٘Պҁנڕ٭ڀڗŌצͦհךچԹħٟҐҁׯ׿ƅԪڧՠΧқ٪ĸږ׺է՛֮ڎڮɌ׻կыװƅڜؠϜ̡/LordةowƘ̐36Ϩ̲ؓօӎ֌ύطиӃř̴هٟٗʄҨntIJƎicƠıcquIJiƘєz۱ʙLJȚvصӫӋӀƎӂӲŌӴ̑ӉӋӹ̵ؙؕ̈́֊ӭLJώۼ ͅsɱ۰۲Łʖřؼ̎ۖӐԀ9ӒܘԆ̔ƫ̆ƙκ̩ɨ ɦ۾ӨȠŘIҽۂIndƟnӚh̀ſ̧ćɤ0ŭؒӤۓش̓ܺєCXƱؠ\tܯܱĖӚocoćې֞ƨєʘĉܨƻېهēCC݆ŲFijiˈԴȤșțҥхŏȠЖݠݢڃՊēԖҜܧŞĒǕݮݣȰŜǼ۵ĴׂŮĸݭݡݺĞמڰբՕݵĹ-ݸބɉ̆ސмھDZ2ͼٝރݯܠΌވݩĚދ΃ގޚĞΙĞмňޞɍޠݷݟޏܠΦŧި˗ЧڳެȇݹސŹէݾڍݬޢޅԧڼį޲ь\tޫލ˺\tPacifۦ/޸1Ġ̬ƨɨܾĊƵӁ26̏٫޸FJ̔݇ߋߍߏc/GambۮijƭƧ5ҰرݕĊւǝɾ-ϯєGǍߤߌߎߐř۫esžƭϥʀے߶ӯƎ߹ЀźAR݆߉ߥࠂߨTahitݣࠉ̫ƧӮߘ̈ࠎtɱ-ؗįTAHࠕƗߊࠁߧߩ۬mĒϦƪůے84ɨɯܦϾnjʒ߻ࠌĞ۷Gҽѿʛȶؼؾۖݛhܭ̣nk ࠗ࠳G࠵ࡖ࠲ߐSaipĖۂࡗߐࠚƜwaĘߓʒƄߗزĪࡆ̓ę٫ēGIL࠯̞ࡤߨEܰɟbӜņ࡫2ϧƫࡅࡁ࠷ࡴߊHOيLJ߸̓ࠩܪࢋࢍڋɾ1ދēPࢌǔϛࡻ/Kì̧ࠞࠞ࠷ĜśۑߘࡱƻࠩĜ4ݔINࢎࠦࠨࠪƮࢲ̿ܗƼ࠸ӪLࢹࡣ࡜ߨıjӜoĈĠࢄذࢇ̏࢓M࠮Ī6࢏ࠏӨࢊ࣏࢝ʆ࢟KࡨjƝeƥࣈĝƾࢆࢫ࢈࡫Ӫ࣑࣓ࣗࠧ࢑̈ƿ\tKWѽΝʇgؼ0ߞ࣯ࣗࣁߦߐChuuk܅ͥĝߴ̱׏ࣦӽݛHUࡹƘ࢟Pohnpࣟ܅3ܼւ࣯ࣥ࣍POࢳ\tࣼ࠘ࢠݏƜ̅Ĝ5ߔ̯जܩ࣯KOӬܛࣹ࣫ӪरलȤझशऱࣘɘ࠱ࣽߨNaӜu࣡अࢰࠌޖɻ̨ԧझݚ\tNࠔŔւܕ्Ͽ࣯Jल࠽ࣵęࢻ࣡ॏ॑ࢴϵ࣯ࣕॡǕNCǘђϼӣģȶޞ٬ݫނ१३ǩԴ7ѯ֝ČӽޡŲ२ˈٹįɯࡪѡЖॿȖ׵ɂؼͲ߈࠰࢟Țumeࡩࣧʔ4इӋւňęࡎؖȠॿ२͋ħNZĪ֞ͮݾ חށŏআথĉӢΖǮ Źٽİ१যȥԴ3ޓѱХ޴ۀهমদС9়גҔԨĹMসĪ3ŹŁһҤڕষॾহ৏ŔєҸŪڛূ্ŁঁŇĖ঄ॼԪতǘްݧȜִٝׄࣿaɡ߫২নݨҌʟעׄ১ǩǫ΍ݳڲ՝Ǖ৯ৱ࠶৻֜ͰՆ৷ڎ৺ϼĶѤڄԏ҆ਂh৲ਅ਎ٛգਉԐণহ7ԭˇ٢ּ਒ਔϼਞٲ׾хਉφ਋ˇ͛ձিՖȇਢ਄ٱ٨ݩ޴ਙ҆਋ڊҐ؄ڿγਚăਲ΂׭਽׿ਸՐă਺ΩɊԦԨהħੂѦ״ৈٴŭ਩০থ੓է৛ס৭ਁਓਃՓਜ਼ũѺੇڥ੉ਖ਼ҟ߂ңਧҕڎੂ؂կڷװ੗Ļ࢞ࣂϟʎkŽܰय़ϯ࡮ݕԣʖ۵ӄॎĢ১তϻ4̯ছęवઇথઉӖࣙ੸ੑŭܾ࢘࣋ં ઄ؼࣹ߁ऌAग़ઌ̨઎।ʟ\tੂCHAʄࡓࡕ࢟ąc੻Ėdƙۢۤࠞۧ/McMӜdoਁoإǘА΍ݾ̈ॱŞ٭HЖCૄःǩ৅ˉ֦е৥ލŲૐૅ૓੃ਗՕॼ્੶ઔी/RIJotĎgࡩࢮࡃĝ઀ईࢬࢧ٭ݛKيઃțࡳࢶӽ૛ःCK۠঎੸Niuă࢒:ĉݓ࣭࣌ࣉєNऎĪपࢶĠॠ଒ॶࠦӂକ॥ऎࠀ૥Țrf˝૒Ġ࡫ܽ࡯ݖࣦଦ˕ॐईଔमॠFيɨߛӹܻӳ଱ƓŏNFलǪلrӄ܍Ӆ଺șଳސߚۻ঴ୄହঞ॥ଳण࠳ߋŽॅ߱ɤ̮଍ƻ߻įPWए࡛૥ऒɠ_Mۇࠆby̪গଌચ8ࣸॗ୬ङଢ଼Mҵ̳ࡏߊGୠ࢟Bռ૬ƥvثĂęࢨગब଩8୯ɾ߳࡬ɩP୵ք۷P୺॓Ԃ஋क़ग़Ƶػޖஒஔޯࡋcؼʖؼ୎ॆєBǃ୒ߐPࠝۧࢢė-ʞࢨϩ଩उࠨƧॏPडȖʖ܋̩֞ͅஷञܭ੷ୢago_ߋைࡪŭ3ɤࠥચॸԂ̩फ़ଉΘઙவߓଜӪNलЇܢr௜஧लǺજૺǎ௣įSࡒƥર੸ோ௉௱ୡतMˮࡨNJŲWψކͮੜѨӽĚׄ௻ސޜŧ՛ৰеϧڬЖఄޛ௾੤˨ৰ߆Ůףఎޤ੫ը੭\tఋݶ఍௼૊੣ড়ݴకƕ૤तιƟ்ʒܧ૱ɬ௓ʧ௕ଜߜ̫இߵ௛଎૵\t௻ल5୰ࢭࣧĢఄSܟĞӃ࠿śؼఝࢗދఄ௻ଂࡺ੸࡙a˟lۧnƝ஄૯গࠌࠥ࢐୏ӪSBएितFakaoଣ࠷ࣉؑశ૲࢈ଉӪT૷అ஠ܦిĈ࢙\t౵֐ȇT૫ঔԵਭɣঅǕಁn૬םলijټц૙ಀಂಌץ৪॰٫޾ŲಉಋಕȰଭި৔঍౑૥ಛৰapॅ࣮ଋࣤவ૳࣮ƫࠫ࢕Łࣦ౼TಲѮ̏ދಥ౽O౐ऐ੸FƂafuࢦଧېନߵಮࢊTV౤࢟W౨̅Ŏݑঘࡰࣦࢊࣲ౶ǕVĖ۬t಩лఐŪĵોޘ೜ೞৰೡ࠼Իфؽ೦ॽȇೝn೟೫৩ͧ೯ఁॳŲೳ೵ЙѬ௫੤џŷ೺ভ೨೴೪ˈк৆߃ৣഃ೰޶ħ೽ഉˢਵഏഅ˹ଃ૥Efৰ೓ଊɦࠣ௚চौঝ஦\tഓೠനUߣࠖ੸೑ج́Ĉગӡழೊ೘࣯Wୈ"); _this.parseZones(ret); this.loadedZones['backward'] = true; ret = utils.lzwDecode("Link\tAfrica/Nairobi\tĄĆĈĊAsmera\nĀĂĔćĉ/AđdjanēąĢĊTimbuktuĞāăAĚĭĤrgentāĊCatamarĉĄĻĖĽĿŁŃ/ComodRivadaviĝğĹŎģAŞăōěŏAtkŢĸŪļAľŀłnĊBuŀos_AĎesŲŏźżžƀrƂķĠĺūŦŵŒŸŔņňŊŌƎļŅŇʼnŋŰƍťėłkoůĪƙŏŕĜl_HŊbourƌŤƏėƑŷńordĐaƄģƪƽbƟƵļįjuĩƿǀĊEnsŀŝDžǍ/IndšƓǗǙNjpoliƃƨģFƻt_WayneƴǕǜǚĊDZǞǠǢǰǘDzǟǡsǯǤƷőƹ/JuljyǕȄȆǾơǖǹNj/KnoxǕȑȓ_INȋƶȐŶucky/LƱǢŠlleǕȤuȦiȨǮţǕŴȁœMŀƽzƿǿ/ȷǘoȺțLJƻoŁoīȌMɅtƊalɂŏŚo_BĜncɇȼPǧɓAcƊɐƐȵƓǂƾǕRŽŊioɡĮiljNjɈȜSĩŇȘsabeɏȲȼDŀvěɲļShipďȠɭ/ɛrǨof_SpčƧȌVĎgāǯPacifĈĤȟklĩdĄŁƗłģSƱth_ɛȩǾsšĤshgɹņīʶėʹkhʼdʵʷKǠůŇʾʷŅlcutŇˆĊʅĩg˃ĒĄʿŔhɅgqāg˔/˖n˘čˌńhu˧kˢˤD˃ů˪/Dʞĉˤ˦˨˚ĘʷƮrđnˤUrumˡ˵KaʹʻƳɽ˜̋ʰʼnǘůņ̔dĶ̐ʷMʞa̖˛̝̟ɬ̜ĊHɓCʆ_Māh̢˕čgɅˤJěuɸȩm˵TɻſŠvˤTʆmpˬ̼̈́IJˤ̞ůsɸr˵Ulj˧ʲʧ˗̄ʦĩDŽƕ͐˾ĊUʦnɔņƻǾt͡ʬ/FŊoȪĄͧɵʢͫěͭǯEƲope/OslɇͯͨʢJĩ̬ǫŀǾ̸ɌɎʷSydǭȇAΊƫʷACTΉs΋ǡ˕ΏΑĄΔΌń͚ěĜΚΜʷȤƼƭowȪΓΛΕĊLHIΨγ˥ΟeΒ΢ΝċSWθΣ˶ŊwāΡβτNǧhσοɕǢDŽǭωΩĊQŻŀ;ʧϏΖdɻčϟϕιʮˑώɽξ˿ƾʎϣτŤ̔šϝĊȷlưƲϔαϖ/ʘctƻϲϨϊοPěʰīϩĊWƂtϳ/ɕƥŀƭȯlϭοYĩɘχnŸʋɒɔɖɘ\tɕazȯĤɟȱűȼόďn˃ēФЦl˶eЭɅ˃ʋɴɓʝuͿУĜг/ĚЍɽɉNj̸бсЧЋΛʋƮǡfaȔ\tŅŸŞĤͰŒcʋWānʇegіNjљCŶƫОѣŃēїǓух-ɴsˊchewĩʋTɄɆѮѦǎхě̃чȜEdŗɆĪѯљɊ˭Ňʛ҆ʄǨJohǐѥјĊNѹfƱǘ͡˅ғŏVЙƱʁ͐ҍĊʝʟʡѝҤģRѬŸҀқ˥̌ѶѸѺ҅ЫȌWʆte˞rǑҚѰYij̴ұ̱Œa̳іʆȩŔɋāŶɎʜʞʠʢфΛʂӑȯͻӝӂrIϛǘѐşɱіuDŽǾĕǁčďēEgypцűͷďͺ˶ӭǡĪ\tEƁͶ͸ӽȤȿԁӻ͹ͻBɻѓяȲԋӽ̪ǢŃ̡ԓͻįĜsǻԅӼͻԈƽԁGBԟԌȣɅԣēԥ-ԃɠԒtc/GMTē\tԵT+0ͶԲԴԶԸԺ-ԽԱԳԺՂԶՅӺԿՈԬƊŀχѷˤ̨͔ˈ˧ēՕgƤ˧ͦ΂ԳҳykĨŠăIcϠӨ̦/̽hɖēIɖ̵̷̹e̻\tӦĜɻʋ΄ʼnĖēսč˹իѽȡ΀΄ʔҽĠҭӛԳKѺĨȩψ֏a֑eҒЫӰĮćǻ˚ĀbyǔȼLjNJҵ\tȷxĈoЏ֕aЭӂʋ̞Ⱥћ֧e֩ɘ֬ĨSƲֱֶ֪_Citȇ֪֨ԴŀěӘȲ֌үʣȠҢ\tNZәҮʢ̪ņ˃շג-CHAΙӌеnҩēČŜj̥Ы˜˻˙ēPRCה֍ʌҗnͺ˚׌ʢɛŸͺײ׍ʝ̳͕Ӑ׹Գɴŗǔ؄˝uij׮Ӛ׍T̆k׾זˬ،\t؉ИpԧӽǪӅaw׮ǠϜԒԆԡϒɅءʎuʻɼתʷϯѢ˚ROױիSeƱЕ\tسK˺ˢaǟƊēSؿفЪĠԙǖΛ͚оēTƲkμԾԳUΘԸٕנҾȜAɗӄӏȪUSĤʦѵ֢Ȍŧaũ١٣eˑǚʋP˞ŀiѕ٫ŴizɅ٦ȜԕĉӐ\t٫ѨŁѪסǴǛȎ׼Ƕƃ٫ӣ-چٻļҝw_Yƻăڌ҃r֊ă؉ՕǠо̖٫ƮѺiiʋڏȐȒȔ٫ڏѳŇrّʋɿɌoׂē٫̭ѷiʻڛǕɿףӟڸҠґڽȼȤƈ˧ɻƂڀ٢؄ؓԳ؀мӏɇ٫؆oǔEԿUTCٗۜٓ/ۛ۝ڷѡҩ̹؛ͻɊsКēWѳU۠ۢԸZڠ"); _this.parseZones(ret); this.loadedZones['etcetera'] = true; ret = utils.lzwDecode("Zone\tEtc/GMT\t\t0\t-\tĉT\nĀĂĄĆ/UTCČĎĐĚCĔāăąćUCċčď\tħēLinkėćĒČČĒ\nįıijęěĶļUniversalĹİIJĥĽĜĶōZuluŊĻōĵŐĘGreenwichŖŌśĊĿŘĊ-0ťļřČŪT+ŭĺŦĴŨŚŸTŭĕĤŧT-14\tƃīĒƂƄĢĖŲƂ3ƅƏĐƈ13ƋſŻƂ2ƅƚƒū12Ɩůƞ1ƅƤƝƁ11ơƍ1ĎƭƇƞŽģƢƁ9\tƶƧ-9ƫƀ-8\tƿƹ8ƼƘ7\tdžƹ7DŽĈū6\tǎƹ6Njƈ5\tǕƹ5ǓūƄƄƹ4ǚƁƏƑđūƕžƴ-ƚƜǤƁƠǧƬƅưƨǠ+ƦƦǬǵǴƜǫĒ+ǮƳŲ+ƑǣǽǦȀƀ+ǝǝǸǟǯȈǗǗǸǙȎŻ+ǐǐǸǒȔnjųLjLjǸNJțǽǁǁǸǃȢĊ+ƸƸǸƻȨųƯƂĞǸƭǴƩďȷƧǵƪȯǵƜƟDzȾ"); _this.parseZones(ret); this.loadedZones['europe'] = true; ret = utils.lzwDecode("Rule\tGB-Eiră1916\tonly\t-\tMaĔ21\t2:00s\t1ğ0\tBST\nĀĂĄĆĈĊģčďđēĕ\tOct\t ĜĞĠĢĦGMĪĬăąćĉċč7ĐĒĔĖAprļ8ĝĥĢĤĠħĩīāŇįŊIJ1ōĵŐ\tSepģōĿġ\tłńŞĭňİŋ1ŖŦķĘŔ24ŗŀģĥŜŅşĮʼnıČŸŎĶĖũū3ĦŮŁĄŲņƇŶţ9ƌŧż\tƑƀůŚĦĨƅŴšƉčƛźƎŪĝƛƓŰƕƦŠƈŋ2ĦƬėaŽŖƱƣƄųƵƙČƸƜķĹĻ25ơƔŃƴƘŢDžĜƺŒŔ 3ǍƂśƥǂǑƩěLJĖljļǙƱűǐŵǒ922ǢƻŽďƿƃǝƗǪǠǮƺǤ ƾŘƲǏǞǷƷǙǕœŨun>=ĎǚǀǵƆȂIJ2ǙDžſƭūSȈȊȌǧƳȁƨƷſȅŔșȉ=ưǾȎŝǶȠȒnjDžďőȆȥțDzȩǴȫȐȭDžȯ93ŖǣĺȇȦǮȝȀȬƶȒťŏķǖɃȊȨƁȪǩȻǬŖDžƛȲȤȚȋȶɒȸɔɉČƠȣɏȧȍɠȟɢȾĜɣǮɚɦȜȷǜȹƧɫ3ȄɌɰȴɧdzɴɡDŽȾȢɺ\tɎɼɲɟɿɪʁ3njɥɼɑƢɩɈʌďɣōɻɜʈʒʊʔǫȿǯʆɜʑřʓȺɷƫʄʢȦʛʥʝʧʌʩƍ\tNovɱɞůǨʋǫ4ƹʄFebɦȓɨʯɶʁ4ǔʄĘĔɼǮƣĢŮħDɵǃʽɭ94ǙőugɦƛˑǛƤ˖ǟŋ4ː˚ȖʅȳɜːǾ˓B˕ʀʽʃʳƏʸˣʮˤ˴Ʃ4ʎʪȆMđȊ˯Ɓ˱˳ʼ˾̀ʳJāˠ˺ˣǁʞ̋IJ4ȱĸɂˏǚʻ̔˧Ĵ́ɛȦʤ̒ȏˈʽɋʳƞʭ̥˥ȑČ4̩ŧɎ1Ȕ˰Ǵ̞̖̲̉ɍ˞ģĦˢɓ̊˧̼Ėʵʷ ɅǾ̝ʰʽŹˌƼģſɾ˼̖̓͏ʳǤ3ľ͋Ȟ̺̰ʲ̳Ȇǘˆ͕͟˚͡LjɂƠɆƖ͍Ʃ5̀95ɯˬ̢ț͓ɳͦͯŋͱIJʹͪĻˏ͜Ɓ̧͌Ͱɹʳʫȵͥ̓ͼͿȔ96ĦɁ΂ˮ̜͞ΏČ5˶͢ͷɽͺΎ·ͽȽ5̘΋ɝ΍̦˗ͰͅͶ͔̐΢άͽɗͳəίʇʹ˻β˦IJΓʡ˭̣Ϊ̮ɕ6˙6˜ǰ\tlastȥσ˽ŋφξɀ̙ΖɄǦ͝ɇΚΒſČ6ʘϊʇ̤͂ͧ6͘ŧˁ˃ƋαΫνČ7˩8Δϣʚκ̭ϒIJϲIJϴ΁˄Ϛ΅ΙΣϽ˙ͳŻ͑όώϐƣuϹ̓Ľ98˙8ηǤˏ̶ĠЎΆγБ9ͲЇΕ˄̆0ЛȞZđăEurope/Lđdđĕ0ğĤ15 ĖLńģ8̱ Dec Ľчзŀ\n\tэ ъłȭ%řΒ8 lj͉7ьюǀĖƥϻ1їĺǘѡ͉ĥuћļѐνѓIJΒѩяƃEUƳ/ǝLink\tЫЭЯбгеѽЮаJersey\nѸѺѼЬ҄ҀnдnҏѾаGu҇n҉ҋҍѻ҃ѿвғ҂ҐѿIsĂ_of_Ęn\nШnЪҦаDublѹж:Njĥм\tоTрϴ A˞ч2ѩ-зҾěӀDпƊ6 ˍ͉ѥŮӋӍ5ҽѡǀIĩţӔјшѦыэѪƃȑѭǓухч6ѰѫȑǏ/ӠӃ̰0 ϫ͉лӦ0Ӳƃӟӡ̰ӣѣ ӔӿԁśĖǏ̻ӕƼĽԉәӨѱśԃӸ˚7 ͇ӉӉĥԋϵԎ̰іǖĽіԊԕӳȭӵӷϕѢtљѰѝ\tԮϱѡј͛ԟКԡνԭԄ9ѯԪѲѴԿǐѳϻōČϾʙʬļЍ̒SǞՈϱή˸ЊϏȈՏѧƲ-ՓѴϱϩϿĽ՛К՝՟ϻˡՁnjȗϋύՙҕĽ՜ΔըՋĜmaxЈŔ՘ϐղզǀՒƗՔՁďոպТս՚տХէƗWćЬՉϽϵΨĜ֌λւƆ֐ѽ֓ƺ՗կվˢմ֏֑Ŕաǯǻ֣֗ĕǞ֜֒ϱժСŨƮ֊ձ֬՞֥֝ն\tևջծЋ֋́ƃ֚ĭ֧֯օֽչϿֶեʺ֭ƗC֦ӢπŔͬ3ԂׄǞגֻij֩ɂդ֌֎ƆלְŌţϖɎ̃ʬnjӿ֙כדƊՊčϖ˸׫ț׭ȝֹפױ˚ʿΊͣ֗αׅăץ׈˨ǯ͇ļǮ׮ףĭ؆̖ΉƝ͑2ƛ؍ցװם˛ןĻ ſ؍֤׼ؚϟ˚լί׷ȋ؋Ρ؄\t̰ؐΝգ،׺ؙצ˿ǯ˸Ȍؠאآצ7׳ՌθʚتʉĦجخ9ؾطֵ֡֋سב׽7բТסَؼ׈7ֲئׁ֠ձٕ؏׽Г׊ֈϊ׍ؗךُםΒ٢׌ٌٝ͝׻ĭEِؿ֕ρțөԗ٧Ɔٲםىًٜ֟ٸĦءٱِْϗՏڂ؎Ъِٙķٛհڊڄڌם١־Ėƞ٥ѫؘփ׽٪ڗڈښƃړ\tĀssiaţή̎lډȓיśM˥ڦڨڪײǯфcĝŖԖڃėͮĭڵکרǯˍƟľ˓˓M̹Ɔۃڷ״يūعǀǀڳǐۏƚۆęۈĝטśۋۍۂuڧۄƊͩĖڭډӿ̒ڳDǞۙۧʡ̾عѫĦڳK۰ۤڶȒˋʳϫ͒۞ڱ۷SۯƗ۱Ǭ۾ؓŽƒ۟ƒƃڳMۺۥېǡٿūסڛܐ܅ܓۼǓ؜۫۶ػۣܔЅϽ˫Ɏܙ܃ŨܝۦВДω֪ڒܣă܈сѮĜխ٥ٞܵۻܮ8ȽčֿܻثܭېǬۛռ֡a؝ڰٹśج܈݈ܗ׀Ϗ݌؋܎ڋڥܾ݇Ǧ01ϵڙ٭كʜم݆ѮΑֳڐվܼݛܥČ٪Ƹݠ٬ځغ՞ҲăWEӃŰՄ\tݺѓĪݸحݻэǀؐCEށұЩėޅ̒ؐMފsނލEޏ˓ՈޗދƗAlbanܮʾǯ̎ҕȌܚݐǞޞޠޢې؈ƺ؊͉ƟڣܴʅޟޡޣֿؒؕơՑޫ޸ޮؑו̿޴śڤެ޹ې7ذژۜ؞ݽݏݦޝ߁ܮߌܠ޳ܢٰă߉߂ϱ̌ؓĔդީߓƆߝߖߠرߑڿߛ޷ޭߖ̠̪ߏǮߤܬߔ߯ߋ߱ŧǻǙߚ߀߸֞͐ߢŖߵجߧߋήǻߴ޵߭ࠇϻڇۇԈ߫޿߷ߊࠏߘĜ߾ࠕߞوۨƻߢnjࠅ߿ֱࠖےƟڃࠌࠣࠜϾƺࠑ߽ܫࠆߕېࠬʄǻſࠚߦ࠲ܦɥ2ďࠢࠛܿ܊ڏƮ2ō࠸ĭࠎՋǹࠂ؋ࠓڜ࠹ࠀࡊߘ࠯߇޶ࡉВ޻ɰƋ࠿ࡐࠤࡘ࠘ࠓ߈࠺Ջߍίߣ࠰ތҳҖґTĉޡċ:ČҽӺнӒč4ѩԴމԙʾ ަԒࡹƃࠎމށܧࡾāࢁśՈࢄޔࡩҴҗ/AҤrrڪъ6ğ4ӀӂIJݟѩѫĖݺࡼӔƏǘԀӨࡺޅՋлżѤԻࢧކݾࢌǐӇώrܮdžɥ nj؃ޫۤtࢷܕ׿ŧظЁ׏ࠍࢿࣁ̖ߺɍȆ1͹ل߶ߦࣉޣʖ˚ϖЗقݭࢵࣀޣήܩϸࡏࡈࣔޯڇ̴ǽ࣑ࠆࣤ֔߄ࠒ࡜ࣣࢶܿࣃࡃū2ࠄࠩރҡаViennڷğӜӏࡵӸЕ3ӆœࢉĦވޓԙƸऋʅ࣫ࢳ̖ӺԦӥƓऑऍࢅ̰лग2ࢯsऑއEՀ˿उrĽठ׮ऑĖࡻ࣋ऑࣜ࣊औնऑࢋऎࢎ࡫ѿMѹsѻĤͱࡱӔअӄࢰƂ;ژࡶžԐyӉѩ˓ĖޗԙƑࢇnӗѩݙژSK̖ѡࡿࣶचדऴ˪ࢇlч3क़ƃۙ۸/ۮѮॆख़ėज़ܸԐऩԺबӨ˓ǀޗՀč ࢥؕडॏƃ॑ࢪՁठࢭঁھढॹܫॼԙǬॿŪљщŘঃśۙޛޔĝݟѡউԛॸэॱFޅݲ࢚ј࠽чˑ३Ԍॲ۹ƗBelgiumۅ࠭͑ ؖѐׯরল঴শۅ۲ТS݌ٷݎࣇǞ঱঳঵ষ۲হǗľ܎াƆৌু৏ǬࣳĖ܀࣏܂ࣩোীৎȒ৛ڈ˅৉Ɣ߭ৗৣܟ৑܁২ࠔ৖ৢূ৭࠵ɂNjয়৊ি্৴Ǭࡋ߲Žࢼ৔ৱĭ৫৽ǭɊϿ৆tৈਃڤਆ৙˅࠼৓݅৻৘Ȓࡥƞ޽ৰ࣢ăਐȮ࣭͓ਃਝħ৳਑࡚࣌ŭਣٺਅਦਉࢺưਫުਖ৬ɖ߄৞ਜਬਞਮDžεʠ৅Ηݶৡৼ਑ࠞɎǡ٦ਲ਼৲੄IJɤ̡ģǙ੉ߥਭੌɣࡂ࡚ؖࢽ਴৽3৿Ξǥݤ৕੔ਗɣ࡙ϊ࠽੡਄਻੕ʂ࣭ڽਗ਼ੋ੤Ⱦߩߎז؂ਕੱਵ3ਨίČ੩ਤਟʗਡ੿਺ਥ੬ʠ৮ࡅ઄੊੣੺੆࣎ď੒࣒ઍੜࠞ؊੾ੂਜ਼৙ޤƺ܀৸઒جઁ˪ࠦŤ੩ਏ਼إ࣭ز੸ઔછੴִۓઑݭઢ̗ۛĔઘੰભ࣋ߘōੂࣹҵѶrۻলŁࡱ7:॔ॄŸϴ࢟૆ૈϵBӒЕঈęপपԠӨࢠݿআ࣏Ԝʶч8भބԙĎौ૖ھॡ֝ॣŸ૞vĽӞЍ્ǜਮހছӹ૦Ƹংࢨƃछ૶।ࢥǘऑਟॣؾशѴࢳোā˟ࠥ৮͛৹੪ħଊթࡠעਏ଒ՋͲ8͵ʆেة৉ଐBଗВ৥˸޽କ޶ଡ঳࠻ʄଥઽ˓մિ࢐SҬۦૈט૥૊8ૌૻΦ:ΦķI૒˚૭ࢦগϵ॒̖ठԝ͉१૘ࢱś૽ࡼ5ૢयझनԞǘ୎޾অԙ٘ॵࢮ৉୆଑ପচԙଚ঒p͉ԉ܎ୢؐ୥ܸୢټ֒୯ݰњ঍ࢊѴ୥כzхh̖યܩࣨݥઓ؅୼c୾झ؉ʶрΘ߭Cஆஈ˚੼ࠑ࣡અஏ୽઻͠ਊࣚٯ୻஘̰ࣟȆdžહஅடࣗ਷ஂ੢஥இ̖એǗϥך଱ґP࢕gҚݽ5ે4࢚ହͱ્ஹ:஻ķPୂԸĺ૩֒ॣ஻୨Ľঠङૻ୐ஐބजࠝଆ௓ࢍƗфnոrिמহષਢࡨ௙ࣾ௜௞Ȍݔחࠩ௤௛Ƽ௞જࡌкڊਤ௚௦୿પઋ੓ă௵௮௷Ǖ۴׹஝௬௶ԅશ۫த\t௼௝઻ݔٔంƆఊ௯ήࠑ؟ఈ఑̻۳ଋĦઙఐ௥௽Ԥఆ঻௹஄ఉఞఋఠ௿˟Ǽદ֭ݸ ࣺ/C҄nhagࣾөुૹହПԁ఺ࡴحୂ࢚JޡপԳƃగொ୊૟ୌড׎حॢऎ୿ୗ్Ԕќైదѻॣ଻౗୸ௗޕҳӆtόntic/FƼoăӌҽે0஼Ӂࡶ0іౄॖ11ԽࢡআГԽՈ૵ǐThƆݰІ͵ݢځॺైǞಃಅՁಇࣴݕϐଯతಎĭݰݞ0Χٶଞܫ܆ƆಗŋȾজಛݴڑಕجಢಥōڠƞɼஂ̒ಠĭಫƸ0ಭ׋͆஋ʇ޾ݦమAm҇౧a/Dޡ௦sవvॖ-й4ுీ࢜ӓ॥͉ૡӨ-ॱWG୦खœӰࢯӋݙಀG௔Ղэ૚ȀಿುࢷcೄScoĊsbysȈdмĤࡅାठ૊ij೔ॠ೗ॐح೛֔౔ԓ୚-˓ވ೤૾ГୟؕӋॻ୹഍ౠeӆ೫ೃ/Godtవ˃೘ҽ࢘Φ࢛ࡶ૥ڭೕೡ঄ݿഅଘഇೠ೗ೢѴ೚ދ೪ೂ೭/ಫ-೏ʍğі೾നāപ೗೏śಫAശޖીTalҺࣿƂ39ബ೒଺ॆĤ൓ബTധіϫைŔ૫9॥ࢁ൚ভ൜एঞęୢଡ଼कӆӈԈবݡॳ̰ѡࢥкൠ౟̖࢚ঀӊӨݙ५ज़७܅Ͻൣউഈӧэಋࢊथ୦ൣঀ࢚౎ഋד୴Ձіൽୱ୹౒ݰൣԹѥെॆഃୈಶठӼě඙ѼसƗFѹ౤d୉߄ɅචଐඬĒޡද̰ਫ਼Ͽϟ௫Ɔඵථܦࡒੵಓ՚උ௺\t඿භශВ͵ݫ՚ݙରോ࢐Hૄѹki൒ൔ4ൣହّ૦͛൥ේηHॊ൪ҋ୷Ħ෉ғඩ௔8२෨ѼකދҟऺаුlڨѺෘరżࣽవmҰණ࢕ncŷ੼ަ৯ਲ෇Fฃฅהৄڈ಼ৰڤฌޡฎڸઉ௢ৠขถŷࠐ঺਱બăตคŷࠞƞդਹઌรญƷ৥ঢ়บஃجฤท৚ܠ১਎޶ิƷ੗ϊਸชత฻۽ืਂఏĭโDžයස৸สซอȒ˩ਿฑଝਔЂ่߭Ǭ੦ۇ੨ํแ๏ȕ݉Ư৹ப෈๟Ǭ஀ͣั๤๘੨ɥથ๝ำ๦ઊਰ๣ප๲ࣦ࣎๪๶ฝȒமজ๵ਤ๘੎؀֧Ʌเ๱๼੖ந຀અຂ๊ࡦຆย๥ຉȾ๚ؔๅป඾๦3ࡥܩਪຒຂયƞ௪ນ็ປ੼ࣧຌหຓล੍஡ǗǦງǞຂฟDZສ๎ດ൓਷ຘาຳປખ஋ϭู๗๦௰ۿ˂ĝఁߒ๞ດˊడ׭ѫۋ຾ໍ฽ǻઑ࣯ฬໍຏศ়ƃ໒ผອඹஊ͈،ݙກ໅ຖŽਖ਼ໞܐ໓໡˚੦࠶ǥ௣ບໍຝͣੑۊ໭໠ีூǺנڽەຍ໅๨Ǘફ۠໻໵໯ضݔعැฺ๦7ஓؔ༁໴຦ດ༒ࠦ੨ଧݷිளƼiૅ0ൔऄ౳आॾࢭкক࢞૙ğ༤ܹ\t௄૤൪ऩ౹༫౺༭śโಁ൮ࡿ૝ୡௐऌ౑௔ோӇgӽ૲෩๏༼ୖ൷୫୚ǀโ଄୶୏ĦषޜȐ҇ոnષஒ਷࣐ຽǶཚޡཝવ໿؝ŭๆŇལཛྷఘசੀՎݭGཬཥຯļďາརrཛཱུఆ౹ǚໟཙཻཤఘƺจ޽໦અཱིྃ཭న੏ϭຒྋོ஭਷܏ລഗଳvࣽtރஉ௠ĝའ޾ܒņॿʶྛྜྷ઩ݔž߆̀਺ྥྚeྜލྞʄગனէலѿ঱r൐ஸטࣶദ༧ईǖ൹ொࢬ૕ोԩཕྯྦྷލொӱཁĄུൺଘ௖ଈ෴రZЬ౧୾రଡ෹షҰమరGib࢕lt͑౮ěҽ౲ൖӅཆ୘ঽཉѬєஹୗ૝࿊̒म౽ൾཕ෱౟ȁĊхŋ੝ޥ̏ ࡆ༖Ňငีဇ఍࠙ලŴဎ˧฽ພࡎྊပධޱ஋޳༏߭Gရ̰໩ࠧမຫဢeစ߃ཧļ࠷ဓဍဪี΀྆ဉဒ໋جဩါΛຏ޲ࠋࡕအဣو༅ģဿཡȐ၂7ય؊੨ঽݚ်ี༙๮΄၇နဲŋၒ৶Ļݳི၉׳ّ࣍Οၔ๤ၐၘՖࡄϸڤၥࠗྪſඳၪ၉๾դൔးဃၗଓྪʑ၏၂࠴ຄډ໘Ąၼତࡄࣷ၀हరAടࣾʥຜ೼࿁рͳௌ࣏൥೏΀őധӔഩ࿀Ԗ༸ඊӪရඕˊୗƑऑၫொ࢚गࡸ෰ၫඕ౾෰ޚඪƆHȈgƼཝƋࢺ֗ྉຫႳnႵrႷڇظઑဠǞႽႿႷ๾௲୙ၵƗჇႶۚဝʷྫ჌߬჆Ⴔაྴ߲ߢ๕ྭႼიჀ௾ྵသ֗ࡇă჏სఅ଍੷ྗ\tშཥࣖෛ஛Վజĭჯ཮ͨၡɦకຒჷΛ৥̴ମჽრཝ;ိ˅ჵყᄄͿؤ5ئ๛ੑႀჾͳᄍئ߼ܳ߭ᄓିဵҕ಼ھଐᄚ੼෎ձღხᄋΛڬ՚ᄞ༂ჟႾკͳၧū٥Ⴥ჎ᄧଣ࣭ઑᄬಾ༞ྺudaЯώƂĎࡳႏŸП԰࿅ඛ״ऑჷொѡगೖက୑୿ᅍᄋ౛ӺঀԨ௏ကབྷ௘ƆIฅවڸฐঢ়มჍᅠᅢ්ธၚĝ֫ူԵᅪ෫Ɗε੾಺ʷ۔ᅰᅡলᅫ܉๡੾ଟਤᅻᅣᅾᄜ۞౏ڤᆃᅽ຺࠼ᅧპ෇ᆊᅳȾࠞǤଦಕ߭ᆑම׾ǯઞ໊ᆏతᆙकढ़ķ؊̛֘ݚᆡ൵ධසᆦ׃ຫᆩ໰઻ᆬقᆧᆂᅲᆚ؈ఠ཰̅،ָǞᆰ̱ξϢ֖׎๤ᇀᆔͫఛᆾƗᆰ;Ϡ̘ࣙɄᆽཪᅱᅼᆒϡืؖᆾಿౣޡ౦౨RҊkjaྚѻ್ҽϖ೒ПᅒĕӟᆷԵS௔Ϩ౔ঠফՃভϜĭI࿪ĶӓဈձࡔၕăᇼൎႷ੼ܲ၎ᆉᇽႷྲྀࡧჭህᇾק௩ࠨ๖ᆿሌস֧͐ሕሃԵመᅴۚᆻةሊ޶ሑ჉๡ߙຒሦ৤๡ǡ၎ᆂሟึ།ƛሤᆘሱໆŧจ௲ሯઅራدતဋሖᇌሷ၄޳ෆᆠቄતࠡᇔሾཞ৮๯ሪሷለנၩሥሷఓ͑ިቑሆ྅ᅭࢻ߫৩ሗቜྎ໇˃ਛቛሒ4ڇᄗݭቍ6ࣖϨЈˎˮ၆ଐቮተη˸ˏትላባΒࠞจሏᆟجቍ7৥ۇ଎ႀኅႃᄲݣᄥኅ˙ϼߎታᇒဧᆐሱ7฽ᄣ̒ችሒϼိኂᆨኘ੦ኁሂቶኣϻ˫ኛ኏ኘਙۜ၍ဌሞቾ၊ሀၿቨཝኴՕಒ׍ስቢኞ༓ĔƠሼᆯኘၟηۇቻበኧኳቫנ့৺ᅠኘࠞ˸ዂ஝ྐྵаRoುݽෛାृ༦рቯௌǭ્ዝିĖRୂईୋѥ࿴࿑ራొୄౕখ࿑ᅔد൤ዯመᅘ࿖स࿘ીዙዛరV݌ೃҰዾ࢐ጀ࢏ґ৆nҮ༠noǞL݌ྚ࠳ֲ̘ಉڑઠጒጔܿ጗ኻݣાᄼዘiႵ൒࢘ຜķ࿰൘ૈጨ˫ዩ૤ԥೞ༪࿻൙ጮ̒LՀ૬ཎ୍Ġ൥ጷየധൣगӘཐጭૈ඼śጹ૤ආ࿈फ୬ૻ੻ፈķጰȒӔӖ౹൬ඩࡼख൰୓ൿബ۸ढ़ዸᅓགྷ૾ோј̵൲ݮۼ