@js-joda/locale_fr 4.15.3 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +94 -12117
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +97 -12121
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +2 -28
- package/package.json +5 -5
- package/dist/js-joda-locale.d.ts +0 -74
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../../src/format/parser/TextPrinterParser.js","../../../src/format/LocaleStore.js","../../../node_modules/cldrjs/dist/cldr.js","../../../node_modules/cldrjs/dist/cldr/event.js","../../../node_modules/cldrjs/dist/cldr/supplemental.js","../../../node_modules/cldrjs/dist/cldr/unresolved.js","../../../node_modules/cldrjs/dist/node_main.js","../../../src/format/cldr/CldrCache.js","../../../src/format/cldr/CldrDateTimeTextProvider.js","../../../src/format/cldr/CldrZoneTextPrinterParser.js","../../../src/format/parser/LocalizedOffsetPrinterParser.js","../../../src/temporal/WeekFields.js","../../../src/format/parser/WeekFieldsPrinterParser.js","../../../src/format/cldr/CldrDateTimeFormatterBuilder.js","../../../src/Locale.js","../../../src/format/LocaleDateTimeFormatter.js","../../../src/_init.js","../../../src/plug.js","../../../src/js-joda-locale.js"],"sourcesContent":["/**\n * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper\n * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos\n * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)\n */\n\nimport { DateTimeFormatterBuilder, IllegalArgumentException, SignStyle, TextStyle } from '@js-joda/core';\n\n//-----------------------------------------------------------------------\n/**\n * Prints or parses field text.\n * @private\n */\nexport default class TextPrinterParser {\n /**\n * Constructor.\n *\n * @param {!TemporalField} field the field to output, not null\n * @param {!TextStyle} textStyle the text style, not null\n * @param {!DateTimeProvider} provider the text provider, not null\n */\n constructor(field, textStyle, provider) {\n // validated by caller\n this._field = field;\n this._textStyle = textStyle;\n this._provider = provider;\n }\n\n field() {\n return this._field;\n }\n\n textStyle() {\n return this._textStyle;\n }\n\n provider() {\n return this._provider;\n }\n\n print(context, buf) {\n const value = context.getValue(this._field);\n if (value === null) {\n return false;\n }\n const text = this._provider.getText(this._field, value, this._textStyle, context.locale());\n if (text === null) {\n return this._numberPrinterParser().print(context, buf);\n }\n buf.append(text);\n return true;\n }\n\n parse(context, parseText, position) {\n const length = parseText.length;\n if (position < 0 || position > length) {\n throw new IllegalArgumentException(`The position is invalid: ${position}`);\n }\n const style = (context.isStrict() ? this._textStyle : null);\n const it = this._provider.getTextIterator(this._field, style, context.locale());\n if (it != null) {\n for (const entry of it) {\n const itText = entry.key;\n if (context.subSequenceEquals(itText, 0, parseText, position, itText.length)) {\n return context.setParsedField(this._field, entry.value, position, position + itText.length);\n }\n }\n if (context.isStrict()) {\n return ~position;\n }\n }\n return this._numberPrinterParser().parse(context, parseText, position);\n }\n\n /**\n * Create and cache a number printer parser.\n * @return the number printer parser for this field, not null\n */\n _numberPrinterParser() {\n if (this._currentNumberPrinterParser == null) {\n this._currentNumberPrinterParser = new DateTimeFormatterBuilder.NumberPrinterParser(this._field, 1, 19, SignStyle.NORMAL);\n }\n return this._currentNumberPrinterParser;\n }\n\n toString() {\n if (this._textStyle === TextStyle.FULL) {\n return `Text(${this._field})`;\n }\n return `Text(${this._field},${this._textStyle})`;\n }\n}\n\n//-----------------------------------------------------------------------\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\n\n/**\n * @private\n *\n * Helper method to create an immutable entry.\n *\n * @param text the text, not null\n * @param field the field, not null\n * @return the entry, not null\n */\nexport const createEntry = (text, field) => {\n return {\n key: text,\n value: field,\n toString: function () {\n return `${text}->${field}`;\n }\n };\n};\n\nconst _comparator = (obj1, obj2) => {\n return obj2.key.length - obj1.key.length; // longest to shortest\n};\n\n/**\n * Stores the text for a single locale.\n * <p>\n * Some fields have a textual representation, such as day-of-week or month-of-year.\n * These textual representations can be captured in this class for printing\n * and parsing.\n */\nexport class LocaleStore {\n //-----------------------------------------------------------------------\n /**\n * Constructor.\n *\n * @param {Object} valueTextMap the map of values to text to store, assigned and not altered, not null\n */\n constructor(valueTextMap) {\n this._valueTextMap = valueTextMap;\n const map = {};\n let allList = [];\n Object.keys(valueTextMap).forEach((style) => {\n const reverse = {};\n const list = [];\n Object.keys(valueTextMap[style]).forEach((key) => {\n const value = valueTextMap[style][key];\n if (reverse[value] === undefined) {\n reverse[value] = createEntry(value, parseInt(key));\n list.push(reverse[value]);\n }\n });\n list.sort(_comparator);\n map[style] = list;\n allList = allList.concat(list);\n map[null] = allList;\n });\n allList.sort(_comparator);\n this._parsable = map;\n }\n\n //-----------------------------------------------------------------------\n /**\n * Gets the text for the specified field value, locale and style\n * for the purpose of printing.\n *\n * @param {Number} value the value to get text for, not null\n * @param {TextStyle} style the style to get text for, not null\n * @return the text for the field value, null if no text found\n */\n getText(value, style) {\n const map = this._valueTextMap[style];\n return map != null ? map[value] : null;\n }\n\n /**\n * Gets an iterator of text to field for the specified style for the purpose of parsing.\n * <p>\n * The iterator must be returned in order from the longest text to the shortest.\n *\n * @param style the style to get text for, null for all parsable text\n * @return the iterator of text to field pairs, in order from longest text to shortest text,\n * null if the style is not parsable\n */\n getTextIterator(style) {\n const list = this._parsable[style];\n return list != null ? list[Symbol.iterator]() : null;\n }\n}\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( root, factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Global\n\t\troot.Cldr = factory();\n\t}\n\n}( this, function() {\n\n\n\tvar arrayIsArray = Array.isArray || function( obj ) {\n\t\treturn Object.prototype.toString.call( obj ) === \"[object Array]\";\n\t};\n\n\n\n\n\tvar pathNormalize = function( path, attributes ) {\n\t\tif ( arrayIsArray( path ) ) {\n\t\t\tpath = path.join( \"/\" );\n\t\t}\n\t\tif ( typeof path !== \"string\" ) {\n\t\t\tthrow new Error( \"invalid path \\\"\" + path + \"\\\"\" );\n\t\t}\n\t\t// 1: Ignore leading slash `/`\n\t\t// 2: Ignore leading `cldr/`\n\t\tpath = path\n\t\t\t.replace( /^\\// , \"\" ) /* 1 */\n\t\t\t.replace( /^cldr\\// , \"\" ); /* 2 */\n\n\t\t// Replace {attribute}'s\n\t\tpath = path.replace( /{[a-zA-Z]+}/g, function( name ) {\n\t\t\tname = name.replace( /^{([^}]*)}$/, \"$1\" );\n\t\t\treturn attributes[ name ];\n\t\t});\n\n\t\treturn path.split( \"/\" );\n\t};\n\n\n\n\n\tvar arraySome = function( array, callback ) {\n\t\tvar i, length;\n\t\tif ( array.some ) {\n\t\t\treturn array.some( callback );\n\t\t}\n\t\tfor ( i = 0, length = array.length; i < length; i++ ) {\n\t\t\tif ( callback( array[ i ], i, array ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\n\n\n\t/**\n\t * Return the maximized language id as defined in\n\t * http://www.unicode.org/reports/tr35/#Likely_Subtags\n\t * 1. Canonicalize.\n\t * 1.1 Make sure the input locale is in canonical form: uses the right\n\t * separator, and has the right casing.\n\t * TODO Right casing? What df? It seems languages are lowercase, scripts are\n\t * Capitalized, territory is uppercase. I am leaving this as an exercise to\n\t * the user.\n\t *\n\t * 1.2 Replace any deprecated subtags with their canonical values using the\n\t * <alias> data in supplemental metadata. Use the first value in the\n\t * replacement list, if it exists. Language tag replacements may have multiple\n\t * parts, such as \"sh\" ➞ \"sr_Latn\" or mo\" ➞ \"ro_MD\". In such a case, the\n\t * original script and/or region are retained if there is one. Thus\n\t * \"sh_Arab_AQ\" ➞ \"sr_Arab_AQ\", not \"sr_Latn_AQ\".\n\t * TODO What <alias> data?\n\t *\n\t * 1.3 If the tag is grandfathered (see <variable id=\"$grandfathered\"\n\t * type=\"choice\"> in the supplemental data), then return it.\n\t * TODO grandfathered?\n\t *\n\t * 1.4 Remove the script code 'Zzzz' and the region code 'ZZ' if they occur.\n\t * 1.5 Get the components of the cleaned-up source tag (languages, scripts,\n\t * and regions), plus any variants and extensions.\n\t * 2. Lookup. Lookup each of the following in order, and stop on the first\n\t * match:\n\t * 2.1 languages_scripts_regions\n\t * 2.2 languages_regions\n\t * 2.3 languages_scripts\n\t * 2.4 languages\n\t * 2.5 und_scripts\n\t * 3. Return\n\t * 3.1 If there is no match, either return an error value, or the match for\n\t * \"und\" (in APIs where a valid language tag is required).\n\t * 3.2 Otherwise there is a match = languagem_scriptm_regionm\n\t * 3.3 Let xr = xs if xs is not empty, and xm otherwise.\n\t * 3.4 Return the language tag composed of languager _ scriptr _ regionr +\n\t * variants + extensions.\n\t *\n\t * @subtags [Array] normalized language id subtags tuple (see init.js).\n\t */\n\tvar coreLikelySubtags = function( Cldr, cldr, subtags, options ) {\n\t\tvar match, matchFound,\n\t\t\tlanguage = subtags[ 0 ],\n\t\t\tscript = subtags[ 1 ],\n\t\t\tsep = Cldr.localeSep,\n\t\t\tterritory = subtags[ 2 ],\n\t\t\tvariants = subtags.slice( 3, 4 );\n\t\toptions = options || {};\n\n\t\t// Skip if (language, script, territory) is not empty [3.3]\n\t\tif ( language !== \"und\" && script !== \"Zzzz\" && territory !== \"ZZ\" ) {\n\t\t\treturn [ language, script, territory ].concat( variants );\n\t\t}\n\n\t\t// Skip if no supplemental likelySubtags data is present\n\t\tif ( typeof cldr.get( \"supplemental/likelySubtags\" ) === \"undefined\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// [2]\n\t\tmatchFound = arraySome([\n\t\t\t[ language, script, territory ],\n\t\t\t[ language, territory ],\n\t\t\t[ language, script ],\n\t\t\t[ language ],\n\t\t\t[ \"und\", script ]\n\t\t], function( test ) {\n\t\t\treturn match = !(/\\b(Zzzz|ZZ)\\b/).test( test.join( sep ) ) /* [1.4] */ && cldr.get( [ \"supplemental/likelySubtags\", test.join( sep ) ] );\n\t\t});\n\n\t\t// [3]\n\t\tif ( matchFound ) {\n\t\t\t// [3.2 .. 3.4]\n\t\t\tmatch = match.split( sep );\n\t\t\treturn [\n\t\t\t\tlanguage !== \"und\" ? language : match[ 0 ],\n\t\t\t\tscript !== \"Zzzz\" ? script : match[ 1 ],\n\t\t\t\tterritory !== \"ZZ\" ? territory : match[ 2 ]\n\t\t\t].concat( variants );\n\t\t} else if ( options.force ) {\n\t\t\t// [3.1.2]\n\t\t\treturn cldr.get( \"supplemental/likelySubtags/und\" ).split( sep );\n\t\t} else {\n\t\t\t// [3.1.1]\n\t\t\treturn;\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Given a locale, remove any fields that Add Likely Subtags would add.\n\t * http://www.unicode.org/reports/tr35/#Likely_Subtags\n\t * 1. First get max = AddLikelySubtags(inputLocale). If an error is signaled,\n\t * return it.\n\t * 2. Remove the variants from max.\n\t * 3. Then for trial in {language, language _ region, language _ script}. If\n\t * AddLikelySubtags(trial) = max, then return trial + variants.\n\t * 4. If you do not get a match, return max + variants.\n\t * \n\t * @maxLanguageId [Array] maxLanguageId tuple (see init.js).\n\t */\n\tvar coreRemoveLikelySubtags = function( Cldr, cldr, maxLanguageId ) {\n\t\tvar match, matchFound,\n\t\t\tlanguage = maxLanguageId[ 0 ],\n\t\t\tscript = maxLanguageId[ 1 ],\n\t\t\tterritory = maxLanguageId[ 2 ],\n\t\t\tvariants = maxLanguageId[ 3 ];\n\n\t\t// [3]\n\t\tmatchFound = arraySome([\n\t\t\t[ [ language, \"Zzzz\", \"ZZ\" ], [ language ] ],\n\t\t\t[ [ language, \"Zzzz\", territory ], [ language, territory ] ],\n\t\t\t[ [ language, script, \"ZZ\" ], [ language, script ] ]\n\t\t], function( test ) {\n\t\t\tvar result = coreLikelySubtags( Cldr, cldr, test[ 0 ] );\n\t\t\tmatch = test[ 1 ];\n\t\t\treturn result && result[ 0 ] === maxLanguageId[ 0 ] &&\n\t\t\t\tresult[ 1 ] === maxLanguageId[ 1 ] &&\n\t\t\t\tresult[ 2 ] === maxLanguageId[ 2 ];\n\t\t});\n\n\t\tif ( matchFound ) {\n\t\t\tif ( variants ) {\n\t\t\t\tmatch.push( variants );\n\t\t\t}\n\t\t\treturn match;\n\t\t}\n\n\t\t// [4]\n\t\treturn maxLanguageId;\n\t};\n\n\n\n\n\t/**\n\t * subtags( locale )\n\t *\n\t * @locale [String]\n\t */\n\tvar coreSubtags = function( locale ) {\n\t\tvar aux, unicodeLanguageId,\n\t\t\tsubtags = [];\n\n\t\tlocale = locale.replace( /_/, \"-\" );\n\n\t\t// Unicode locale extensions.\n\t\taux = locale.split( \"-u-\" );\n\t\tif ( aux[ 1 ] ) {\n\t\t\taux[ 1 ] = aux[ 1 ].split( \"-t-\" );\n\t\t\tlocale = aux[ 0 ] + ( aux[ 1 ][ 1 ] ? \"-t-\" + aux[ 1 ][ 1 ] : \"\");\n\t\t\tsubtags[ 4 /* unicodeLocaleExtensions */ ] = aux[ 1 ][ 0 ];\n\t\t}\n\n\t\t// TODO normalize transformed extensions. Currently, skipped.\n\t\t// subtags[ x ] = locale.split( \"-t-\" )[ 1 ];\n\t\tunicodeLanguageId = locale.split( \"-t-\" )[ 0 ];\n\n\t\t// unicode_language_id = \"root\"\n\t\t// | unicode_language_subtag \n\t\t// (sep unicode_script_subtag)? \n\t\t// (sep unicode_region_subtag)?\n\t\t// (sep unicode_variant_subtag)* ;\n\t\t//\n\t\t// Although unicode_language_subtag = alpha{2,8}, I'm using alpha{2,3}. Because, there's no language on CLDR lengthier than 3.\n\t\taux = unicodeLanguageId.match( /^(([a-z]{2,3})(-([A-Z][a-z]{3}))?(-([A-Z]{2}|[0-9]{3}))?)((-([a-zA-Z0-9]{5,8}|[0-9][a-zA-Z0-9]{3}))*)$|^(root)$/ );\n\t\tif ( aux === null ) {\n\t\t\treturn [ \"und\", \"Zzzz\", \"ZZ\" ];\n\t\t}\n\t\tsubtags[ 0 /* language */ ] = aux[ 10 ] /* root */ || aux[ 2 ] || \"und\";\n\t\tsubtags[ 1 /* script */ ] = aux[ 4 ] || \"Zzzz\";\n\t\tsubtags[ 2 /* territory */ ] = aux[ 6 ] || \"ZZ\";\n\t\tif ( aux[ 7 ] && aux[ 7 ].length ) {\n\t\t\tsubtags[ 3 /* variant */ ] = aux[ 7 ].slice( 1 ) /* remove leading \"-\" */;\n\t\t}\n\n\t\t// 0: language\n\t\t// 1: script\n\t\t// 2: territory (aka region)\n\t\t// 3: variant\n\t\t// 4: unicodeLocaleExtensions\n\t\treturn subtags;\n\t};\n\n\n\n\n\tvar arrayForEach = function( array, callback ) {\n\t\tvar i, length;\n\t\tif ( array.forEach ) {\n\t\t\treturn array.forEach( callback );\n\t\t}\n\t\tfor ( i = 0, length = array.length; i < length; i++ ) {\n\t\t\tcallback( array[ i ], i, array );\n\t\t}\n\t};\n\n\n\n\n\t/**\n\t * bundleLookup( minLanguageId )\n\t *\n\t * @Cldr [Cldr class]\n\t *\n\t * @cldr [Cldr instance]\n\t *\n\t * @minLanguageId [String] requested languageId after applied remove likely subtags.\n\t */\n\tvar bundleLookup = function( Cldr, cldr, minLanguageId ) {\n\t\tvar availableBundleMap = Cldr._availableBundleMap,\n\t\t\tavailableBundleMapQueue = Cldr._availableBundleMapQueue;\n\n\t\tif ( availableBundleMapQueue.length ) {\n\t\t\tarrayForEach( availableBundleMapQueue, function( bundle, i ) {\n\t\t\t\tvar existing, maxBundle, minBundle, subtags;\n\t\t\t\tsubtags = coreSubtags( bundle );\n\t\t\t\tmaxBundle = coreLikelySubtags( Cldr, cldr, subtags );\n\t\t\t\tif ( maxBundle === undefined ) {\n\t\t\t\t\tavailableBundleMapQueue.splice( i, 1 );\n\t\t\t\t\tthrow new Error( \"Could not find likelySubtags for \" + bundle );\n\t\t\t\t}\n\t\t\t\tminBundle = coreRemoveLikelySubtags( Cldr, cldr, maxBundle );\n\t\t\t\tminBundle = minBundle.join( Cldr.localeSep );\n\t\t\t\texisting = availableBundleMap[ minBundle ];\n\t\t\t\tif ( existing && existing.length < bundle.length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tavailableBundleMap[ minBundle ] = bundle;\n\t\t\t});\n\t\t\tCldr._availableBundleMapQueue = [];\n\t\t}\n\n\t\treturn availableBundleMap[ minLanguageId ] || null;\n\t};\n\n\n\n\n\tvar objectKeys = function( object ) {\n\t\tvar i,\n\t\t\tresult = [];\n\n\t\tif ( Object.keys ) {\n\t\t\treturn Object.keys( object );\n\t\t}\n\n\t\tfor ( i in object ) {\n\t\t\tresult.push( i );\n\t\t}\n\n\t\treturn result;\n\t};\n\n\n\n\n\tvar createError = function( code, attributes ) {\n\t\tvar error, message;\n\n\t\tmessage = code + ( attributes && JSON ? \": \" + JSON.stringify( attributes ) : \"\" );\n\t\terror = new Error( message );\n\t\terror.code = code;\n\n\t\t// extend( error, attributes );\n\t\tarrayForEach( objectKeys( attributes ), function( attribute ) {\n\t\t\terror[ attribute ] = attributes[ attribute ];\n\t\t});\n\n\t\treturn error;\n\t};\n\n\n\n\n\tvar validate = function( code, check, attributes ) {\n\t\tif ( !check ) {\n\t\t\tthrow createError( code, attributes );\n\t\t}\n\t};\n\n\n\n\n\tvar validatePresence = function( value, name ) {\n\t\tvalidate( \"E_MISSING_PARAMETER\", typeof value !== \"undefined\", {\n\t\t\tname: name\n\t\t});\n\t};\n\n\n\n\n\tvar validateType = function( value, name, check, expected ) {\n\t\tvalidate( \"E_INVALID_PAR_TYPE\", check, {\n\t\t\texpected: expected,\n\t\t\tname: name,\n\t\t\tvalue: value\n\t\t});\n\t};\n\n\n\n\n\tvar validateTypePath = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"string\" || arrayIsArray( value ), \"String or Array\" );\n\t};\n\n\n\n\n\t/**\n\t * Function inspired by jQuery Core, but reduced to our use case.\n\t */\n\tvar isPlainObject = function( obj ) {\n\t\treturn obj !== null && \"\" + obj === \"[object Object]\";\n\t};\n\n\n\n\n\tvar validateTypePlainObject = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"undefined\" || isPlainObject( value ), \"Plain Object\" );\n\t};\n\n\n\n\n\tvar validateTypeString = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"string\", \"a string\" );\n\t};\n\n\n\n\n\t// @path: normalized path\n\tvar resourceGet = function( data, path ) {\n\t\tvar i,\n\t\t\tnode = data,\n\t\t\tlength = path.length;\n\n\t\tfor ( i = 0; i < length - 1; i++ ) {\n\t\t\tnode = node[ path[ i ] ];\n\t\t\tif ( !node ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t\treturn node[ path[ i ] ];\n\t};\n\n\n\n\n\t/**\n\t * setAvailableBundles( Cldr, json )\n\t *\n\t * @Cldr [Cldr class]\n\t *\n\t * @json resolved/unresolved cldr data.\n\t *\n\t * Set available bundles queue based on passed json CLDR data. Considers a bundle as any String at /main/{bundle}.\n\t */\n\tvar coreSetAvailableBundles = function( Cldr, json ) {\n\t\tvar bundle,\n\t\t\tavailableBundleMapQueue = Cldr._availableBundleMapQueue,\n\t\t\tmain = resourceGet( json, [ \"main\" ] );\n\n\t\tif ( main ) {\n\t\t\tfor ( bundle in main ) {\n\t\t\t\tif ( main.hasOwnProperty( bundle ) && bundle !== \"root\" &&\n\t\t\t\t\t\t\tavailableBundleMapQueue.indexOf( bundle ) === -1 ) {\n\t\t\t\t\tavailableBundleMapQueue.push( bundle );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\n\n\tvar alwaysArray = function( somethingOrArray ) {\n\t\treturn arrayIsArray( somethingOrArray ) ? somethingOrArray : [ somethingOrArray ];\n\t};\n\n\n\tvar jsonMerge = (function() {\n\n\t// Returns new deeply merged JSON.\n\t//\n\t// Eg.\n\t// merge( { a: { b: 1, c: 2 } }, { a: { b: 3, d: 4 } } )\n\t// -> { a: { b: 3, c: 2, d: 4 } }\n\t//\n\t// @arguments JSON's\n\t// \n\tvar merge = function() {\n\t\tvar destination = {},\n\t\t\tsources = [].slice.call( arguments, 0 );\n\t\tarrayForEach( sources, function( source ) {\n\t\t\tvar prop;\n\t\t\tfor ( prop in source ) {\n\t\t\t\tif ( prop in destination && typeof destination[ prop ] === \"object\" && !arrayIsArray( destination[ prop ] ) ) {\n\n\t\t\t\t\t// Merge Objects\n\t\t\t\t\tdestination[ prop ] = merge( destination[ prop ], source[ prop ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Set new values\n\t\t\t\t\tdestination[ prop ] = source[ prop ];\n\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn destination;\n\t};\n\n\treturn merge;\n\n}());\n\n\n\t/**\n\t * load( Cldr, source, jsons )\n\t *\n\t * @Cldr [Cldr class]\n\t *\n\t * @source [Object]\n\t *\n\t * @jsons [arguments]\n\t */\n\tvar coreLoad = function( Cldr, source, jsons ) {\n\t\tvar i, j, json;\n\n\t\tvalidatePresence( jsons[ 0 ], \"json\" );\n\n\t\t// Support arbitrary parameters, e.g., `Cldr.load({...}, {...})`.\n\t\tfor ( i = 0; i < jsons.length; i++ ) {\n\n\t\t\t// Support array parameters, e.g., `Cldr.load([{...}, {...}])`.\n\t\t\tjson = alwaysArray( jsons[ i ] );\n\n\t\t\tfor ( j = 0; j < json.length; j++ ) {\n\t\t\t\tvalidateTypePlainObject( json[ j ], \"json\" );\n\t\t\t\tsource = jsonMerge( source, json[ j ] );\n\t\t\t\tcoreSetAvailableBundles( Cldr, json[ j ] );\n\t\t\t}\n\t\t}\n\n\t\treturn source;\n\t};\n\n\n\n\tvar itemGetResolved = function( Cldr, path, attributes ) {\n\t\t// Resolve path\n\t\tvar normalizedPath = pathNormalize( path, attributes );\n\n\t\treturn resourceGet( Cldr._resolved, normalizedPath );\n\t};\n\n\n\n\n\t/**\n\t * new Cldr()\n\t */\n\tvar Cldr = function( locale ) {\n\t\tthis.init( locale );\n\t};\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tCldr._alwaysArray = alwaysArray;\n\tCldr._coreLoad = coreLoad;\n\tCldr._createError = createError;\n\tCldr._itemGetResolved = itemGetResolved;\n\tCldr._jsonMerge = jsonMerge;\n\tCldr._pathNormalize = pathNormalize;\n\tCldr._resourceGet = resourceGet;\n\tCldr._validatePresence = validatePresence;\n\tCldr._validateType = validateType;\n\tCldr._validateTypePath = validateTypePath;\n\tCldr._validateTypePlainObject = validateTypePlainObject;\n\n\tCldr._availableBundleMap = {};\n\tCldr._availableBundleMapQueue = [];\n\tCldr._resolved = {};\n\n\t// Allow user to override locale separator \"-\" (default) | \"_\". According to http://www.unicode.org/reports/tr35/#Unicode_language_identifier, both \"-\" and \"_\" are valid locale separators (eg. \"en_GB\", \"en-GB\"). According to http://unicode.org/cldr/trac/ticket/6786 its usage must be consistent throughout the data set.\n\tCldr.localeSep = \"-\";\n\n\t/**\n\t * Cldr.load( json [, json, ...] )\n\t *\n\t * @json [JSON] CLDR data or [Array] Array of @json's.\n\t *\n\t * Load resolved cldr data.\n\t */\n\tCldr.load = function() {\n\t\tCldr._resolved = coreLoad( Cldr, Cldr._resolved, arguments );\n\t};\n\n\t/**\n\t * .init() automatically run on instantiation/construction.\n\t */\n\tCldr.prototype.init = function( locale ) {\n\t\tvar attributes, language, maxLanguageId, minLanguageId, script, subtags, territory, unicodeLocaleExtensions, variant,\n\t\t\tsep = Cldr.localeSep,\n\t\t\tunicodeLocaleExtensionsRaw = \"\";\n\n\t\tvalidatePresence( locale, \"locale\" );\n\t\tvalidateTypeString( locale, \"locale\" );\n\n\t\tsubtags = coreSubtags( locale );\n\n\t\tif ( subtags.length === 5 ) {\n\t\t\tunicodeLocaleExtensions = subtags.pop();\n\t\t\tunicodeLocaleExtensionsRaw = sep + \"u\" + sep + unicodeLocaleExtensions;\n\t\t\t// Remove trailing null when there is unicodeLocaleExtensions but no variants.\n\t\t\tif ( !subtags[ 3 ] ) {\n\t\t\t\tsubtags.pop();\n\t\t\t}\n\t\t}\n\t\tvariant = subtags[ 3 ];\n\n\t\t// Normalize locale code.\n\t\t// Get (or deduce) the \"triple subtags\": language, territory (also aliased as region), and script subtags.\n\t\t// Get the variant subtags (calendar, collation, currency, etc).\n\t\t// refs:\n\t\t// - http://www.unicode.org/reports/tr35/#Field_Definitions\n\t\t// - http://www.unicode.org/reports/tr35/#Language_and_Locale_IDs\n\t\t// - http://www.unicode.org/reports/tr35/#Unicode_locale_identifier\n\n\t\t// When a locale id does not specify a language, or territory (region), or script, they are obtained by Likely Subtags.\n\t\tmaxLanguageId = coreLikelySubtags( Cldr, this, subtags, { force: true } ) || subtags;\n\t\tlanguage = maxLanguageId[ 0 ];\n\t\tscript = maxLanguageId[ 1 ];\n\t\tterritory = maxLanguageId[ 2 ];\n\n\t\tminLanguageId = coreRemoveLikelySubtags( Cldr, this, maxLanguageId ).join( sep );\n\n\t\t// Set attributes\n\t\tthis.attributes = attributes = {\n\t\t\tbundle: bundleLookup( Cldr, this, minLanguageId ),\n\n\t\t\t// Unicode Language Id\n\t\t\tminLanguageId: minLanguageId + unicodeLocaleExtensionsRaw,\n\t\t\tmaxLanguageId: maxLanguageId.join( sep ) + unicodeLocaleExtensionsRaw,\n\n\t\t\t// Unicode Language Id Subtabs\n\t\t\tlanguage: language,\n\t\t\tscript: script,\n\t\t\tterritory: territory,\n\t\t\tregion: territory, /* alias */\n\t\t\tvariant: variant\n\t\t};\n\n\t\t// Unicode locale extensions.\n\t\tunicodeLocaleExtensions && ( \"-\" + unicodeLocaleExtensions ).replace( /-[a-z]{3,8}|(-[a-z]{2})-([a-z]{3,8})/g, function( attribute, key, type ) {\n\n\t\t\tif ( key ) {\n\n\t\t\t\t// Extension is in the `keyword` form.\n\t\t\t\tattributes[ \"u\" + key ] = type;\n\t\t\t} else {\n\n\t\t\t\t// Extension is in the `attribute` form.\n\t\t\t\tattributes[ \"u\" + attribute ] = true;\n\t\t\t}\n\t\t});\n\n\t\tthis.locale = locale;\n\t};\n\n\t/**\n\t * .get()\n\t */\n\tCldr.prototype.get = function( path ) {\n\n\t\tvalidatePresence( path, \"path\" );\n\t\tvalidateTypePath( path, \"path\" );\n\n\t\treturn itemGetResolved( Cldr, path, this.attributes );\n\t};\n\n\t/**\n\t * .main()\n\t */\n\tCldr.prototype.main = function( path ) {\n\t\tvalidatePresence( path, \"path\" );\n\t\tvalidateTypePath( path, \"path\" );\n\n\t\tvalidate( \"E_MISSING_BUNDLE\", this.attributes.bundle !== null, {\n\t\t\tlocale: this.locale\n\t\t});\n\n\t\tpath = alwaysArray( path );\n\t\treturn this.get( [ \"main/{bundle}\" ].concat( path ) );\n\t};\n\n\treturn Cldr;\n\n\n\n\n}));\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( [ \"../cldr\" ], factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory( require( \"../cldr\" ) );\n\t} else {\n\t\t// Global\n\t\tfactory( Cldr );\n\t}\n\n}(function( Cldr ) {\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tvar pathNormalize = Cldr._pathNormalize,\n\t\tvalidatePresence = Cldr._validatePresence,\n\t\tvalidateType = Cldr._validateType;\n\n/*!\n * EventEmitter v4.2.7 - git.io/ee\n * Oliver Caldwell\n * MIT license\n * @preserve\n */\n\nvar EventEmitter;\n/* jshint ignore:start */\nEventEmitter = (function () {\n\n\n\t/**\n\t * Class for managing events.\n\t * Can be extended to provide event functionality in other classes.\n\t *\n\t * @class EventEmitter Manages event registering and emitting.\n\t */\n\tfunction EventEmitter() {}\n\n\t// Shortcuts to improve speed and size\n\tvar proto = EventEmitter.prototype;\n\tvar exports = {};\n\t\n\n\t/**\n\t * Finds the index of the listener for the event in it's storage array.\n\t *\n\t * @param {Function[]} listeners Array of listeners to search through.\n\t * @param {Function} listener Method to look for.\n\t * @return {Number} Index of the specified listener, -1 if not found\n\t * @api private\n\t */\n\tfunction indexOfListener(listeners, listener) {\n\t\tvar i = listeners.length;\n\t\twhile (i--) {\n\t\t\tif (listeners[i].listener === listener) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Alias a method while keeping the context correct, to allow for overwriting of target method.\n\t *\n\t * @param {String} name The name of the target method.\n\t * @return {Function} The aliased method\n\t * @api private\n\t */\n\tfunction alias(name) {\n\t\treturn function aliasClosure() {\n\t\t\treturn this[name].apply(this, arguments);\n\t\t};\n\t}\n\n\t/**\n\t * Returns the listener array for the specified event.\n\t * Will initialise the event object and listener arrays if required.\n\t * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them.\n\t * Each property in the object response is an array of listener functions.\n\t *\n\t * @param {String|RegExp} evt Name of the event to return the listeners from.\n\t * @return {Function[]|Object} All listener functions for the event.\n\t */\n\tproto.getListeners = function getListeners(evt) {\n\t\tvar events = this._getEvents();\n\t\tvar response;\n\t\tvar key;\n\n\t\t// Return a concatenated array of all matching events if\n\t\t// the selector is a regular expression.\n\t\tif (evt instanceof RegExp) {\n\t\t\tresponse = {};\n\t\t\tfor (key in events) {\n\t\t\t\tif (events.hasOwnProperty(key) && evt.test(key)) {\n\t\t\t\t\tresponse[key] = events[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tresponse = events[evt] || (events[evt] = []);\n\t\t}\n\n\t\treturn response;\n\t};\n\n\t/**\n\t * Takes a list of listener objects and flattens it into a list of listener functions.\n\t *\n\t * @param {Object[]} listeners Raw listener objects.\n\t * @return {Function[]} Just the listener functions.\n\t */\n\tproto.flattenListeners = function flattenListeners(listeners) {\n\t\tvar flatListeners = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < listeners.length; i += 1) {\n\t\t\tflatListeners.push(listeners[i].listener);\n\t\t}\n\n\t\treturn flatListeners;\n\t};\n\n\t/**\n\t * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful.\n\t *\n\t * @param {String|RegExp} evt Name of the event to return the listeners from.\n\t * @return {Object} All listener functions for an event in an object.\n\t */\n\tproto.getListenersAsObject = function getListenersAsObject(evt) {\n\t\tvar listeners = this.getListeners(evt);\n\t\tvar response;\n\n\t\tif (listeners instanceof Array) {\n\t\t\tresponse = {};\n\t\t\tresponse[evt] = listeners;\n\t\t}\n\n\t\treturn response || listeners;\n\t};\n\n\t/**\n\t * Adds a listener function to the specified event.\n\t * The listener will not be added if it is a duplicate.\n\t * If the listener returns true then it will be removed after it is called.\n\t * If you pass a regular expression as the event name then the listener will be added to all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to attach the listener to.\n\t * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.addListener = function addListener(evt, listener) {\n\t\tvar listeners = this.getListenersAsObject(evt);\n\t\tvar listenerIsWrapped = typeof listener === 'object';\n\t\tvar key;\n\n\t\tfor (key in listeners) {\n\t\t\tif (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) {\n\t\t\t\tlisteners[key].push(listenerIsWrapped ? listener : {\n\t\t\t\t\tlistener: listener,\n\t\t\t\t\tonce: false\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of addListener\n\t */\n\tproto.on = alias('addListener');\n\n\t/**\n\t * Semi-alias of addListener. It will add a listener that will be\n\t * automatically removed after it's first execution.\n\t *\n\t * @param {String|RegExp} evt Name of the event to attach the listener to.\n\t * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.addOnceListener = function addOnceListener(evt, listener) {\n\t\treturn this.addListener(evt, {\n\t\t\tlistener: listener,\n\t\t\tonce: true\n\t\t});\n\t};\n\n\t/**\n\t * Alias of addOnceListener.\n\t */\n\tproto.once = alias('addOnceListener');\n\n\t/**\n\t * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad.\n\t * You need to tell it what event names should be matched by a regex.\n\t *\n\t * @param {String} evt Name of the event to create.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.defineEvent = function defineEvent(evt) {\n\t\tthis.getListeners(evt);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Uses defineEvent to define multiple events.\n\t *\n\t * @param {String[]} evts An array of event names to define.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.defineEvents = function defineEvents(evts) {\n\t\tfor (var i = 0; i < evts.length; i += 1) {\n\t\t\tthis.defineEvent(evts[i]);\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Removes a listener function from the specified event.\n\t * When passed a regular expression as the event name, it will remove the listener from all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to remove the listener from.\n\t * @param {Function} listener Method to remove from the event.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.removeListener = function removeListener(evt, listener) {\n\t\tvar listeners = this.getListenersAsObject(evt);\n\t\tvar index;\n\t\tvar key;\n\n\t\tfor (key in listeners) {\n\t\t\tif (listeners.hasOwnProperty(key)) {\n\t\t\t\tindex = indexOfListener(listeners[key], listener);\n\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tlisteners[key].splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of removeListener\n\t */\n\tproto.off = alias('removeListener');\n\n\t/**\n\t * Adds listeners in bulk using the manipulateListeners method.\n\t * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.\n\t * You can also pass it a regular expression to add the array of listeners to all events that match it.\n\t * Yeah, this function does quite a bit. That's probably a bad thing.\n\t *\n\t * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once.\n\t * @param {Function[]} [listeners] An optional array of listener functions to add.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.addListeners = function addListeners(evt, listeners) {\n\t\t// Pass through to manipulateListeners\n\t\treturn this.manipulateListeners(false, evt, listeners);\n\t};\n\n\t/**\n\t * Removes listeners in bulk using the manipulateListeners method.\n\t * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n\t * You can also pass it an event name and an array of listeners to be removed.\n\t * You can also pass it a regular expression to remove the listeners from all events that match it.\n\t *\n\t * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once.\n\t * @param {Function[]} [listeners] An optional array of listener functions to remove.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.removeListeners = function removeListeners(evt, listeners) {\n\t\t// Pass through to manipulateListeners\n\t\treturn this.manipulateListeners(true, evt, listeners);\n\t};\n\n\t/**\n\t * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level.\n\t * The first argument will determine if the listeners are removed (true) or added (false).\n\t * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n\t * You can also pass it an event name and an array of listeners to be added/removed.\n\t * You can also pass it a regular expression to manipulate the listeners of all events that match it.\n\t *\n\t * @param {Boolean} remove True if you want to remove listeners, false if you want to add.\n\t * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once.\n\t * @param {Function[]} [listeners] An optional array of listener functions to add/remove.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {\n\t\tvar i;\n\t\tvar value;\n\t\tvar single = remove ? this.removeListener : this.addListener;\n\t\tvar multiple = remove ? this.removeListeners : this.addListeners;\n\n\t\t// If evt is an object then pass each of it's properties to this method\n\t\tif (typeof evt === 'object' && !(evt instanceof RegExp)) {\n\t\t\tfor (i in evt) {\n\t\t\t\tif (evt.hasOwnProperty(i) && (value = evt[i])) {\n\t\t\t\t\t// Pass the single listener straight through to the singular method\n\t\t\t\t\tif (typeof value === 'function') {\n\t\t\t\t\t\tsingle.call(this, i, value);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Otherwise pass back to the multiple function\n\t\t\t\t\t\tmultiple.call(this, i, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// So evt must be a string\n\t\t\t// And listeners must be an array of listeners\n\t\t\t// Loop over it and pass each one to the multiple method\n\t\t\ti = listeners.length;\n\t\t\twhile (i--) {\n\t\t\t\tsingle.call(this, evt, listeners[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Removes all listeners from a specified event.\n\t * If you do not specify an event then all listeners will be removed.\n\t * That means every event will be emptied.\n\t * You can also pass a regex to remove all events that match it.\n\t *\n\t * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.removeEvent = function removeEvent(evt) {\n\t\tvar type = typeof evt;\n\t\tvar events = this._getEvents();\n\t\tvar key;\n\n\t\t// Remove different things depending on the state of evt\n\t\tif (type === 'string') {\n\t\t\t// Remove all listeners for the specified event\n\t\t\tdelete events[evt];\n\t\t}\n\t\telse if (evt instanceof RegExp) {\n\t\t\t// Remove all events matching the regex.\n\t\t\tfor (key in events) {\n\t\t\t\tif (events.hasOwnProperty(key) && evt.test(key)) {\n\t\t\t\t\tdelete events[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Remove all listeners in all events\n\t\t\tdelete this._events;\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of removeEvent.\n\t *\n\t * Added to mirror the node API.\n\t */\n\tproto.removeAllListeners = alias('removeEvent');\n\n\t/**\n\t * Emits an event of your choice.\n\t * When emitted, every listener attached to that event will be executed.\n\t * If you pass the optional argument array then those arguments will be passed to every listener upon execution.\n\t * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.\n\t * So they will not arrive within the array on the other side, they will be separate.\n\t * You can also pass a regular expression to emit to all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n\t * @param {Array} [args] Optional array of arguments to be passed to each listener.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.emitEvent = function emitEvent(evt, args) {\n\t\tvar listeners = this.getListenersAsObject(evt);\n\t\tvar listener;\n\t\tvar i;\n\t\tvar key;\n\t\tvar response;\n\n\t\tfor (key in listeners) {\n\t\t\tif (listeners.hasOwnProperty(key)) {\n\t\t\t\ti = listeners[key].length;\n\n\t\t\t\twhile (i--) {\n\t\t\t\t\t// If the listener returns true then it shall be removed from the event\n\t\t\t\t\t// The function is executed either with a basic call or an apply if there is an args array\n\t\t\t\t\tlistener = listeners[key][i];\n\n\t\t\t\t\tif (listener.once === true) {\n\t\t\t\t\t\tthis.removeListener(evt, listener.listener);\n\t\t\t\t\t}\n\n\t\t\t\t\tresponse = listener.listener.apply(this, args || []);\n\n\t\t\t\t\tif (response === this._getOnceReturnValue()) {\n\t\t\t\t\t\tthis.removeListener(evt, listener.listener);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of emitEvent\n\t */\n\tproto.trigger = alias('emitEvent');\n\n\t/**\n\t * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on.\n\t * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n\t * @param {...*} Optional additional arguments to be passed to each listener.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.emit = function emit(evt) {\n\t\tvar args = Array.prototype.slice.call(arguments, 1);\n\t\treturn this.emitEvent(evt, args);\n\t};\n\n\t/**\n\t * Sets the current value to check against when executing listeners. If a\n\t * listeners return value matches the one set here then it will be removed\n\t * after execution. This value defaults to true.\n\t *\n\t * @param {*} value The new value to check for when executing listeners.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.setOnceReturnValue = function setOnceReturnValue(value) {\n\t\tthis._onceReturnValue = value;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Fetches the current value to check against when executing listeners. If\n\t * the listeners return value matches this one then it should be removed\n\t * automatically. It will return true by default.\n\t *\n\t * @return {*|Boolean} The current value to check for or the default, true.\n\t * @api private\n\t */\n\tproto._getOnceReturnValue = function _getOnceReturnValue() {\n\t\tif (this.hasOwnProperty('_onceReturnValue')) {\n\t\t\treturn this._onceReturnValue;\n\t\t}\n\t\telse {\n\t\t\treturn true;\n\t\t}\n\t};\n\n\t/**\n\t * Fetches the events object and creates one if required.\n\t *\n\t * @return {Object} The events storage object.\n\t * @api private\n\t */\n\tproto._getEvents = function _getEvents() {\n\t\treturn this._events || (this._events = {});\n\t};\n\n\t/**\n\t * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version.\n\t *\n\t * @return {Function} Non conflicting EventEmitter class.\n\t */\n\tEventEmitter.noConflict = function noConflict() {\n\t\texports.EventEmitter = originalGlobalValue;\n\t\treturn EventEmitter;\n\t};\n\n\treturn EventEmitter;\n}());\n/* jshint ignore:end */\n\n\n\n\tvar validateTypeFunction = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"undefined\" || typeof value === \"function\", \"Function\" );\n\t};\n\n\n\n\n\tvar superGet, superInit,\n\t\tglobalEe = new EventEmitter();\n\n\tfunction validateTypeEvent( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"string\" || value instanceof RegExp, \"String or RegExp\" );\n\t}\n\n\tfunction validateThenCall( method, self ) {\n\t\treturn function( event, listener ) {\n\t\t\tvalidatePresence( event, \"event\" );\n\t\t\tvalidateTypeEvent( event, \"event\" );\n\n\t\t\tvalidatePresence( listener, \"listener\" );\n\t\t\tvalidateTypeFunction( listener, \"listener\" );\n\n\t\t\treturn self[ method ].apply( self, arguments );\n\t\t};\n\t}\n\n\tfunction off( self ) {\n\t\treturn validateThenCall( \"off\", self );\n\t}\n\n\tfunction on( self ) {\n\t\treturn validateThenCall( \"on\", self );\n\t}\n\n\tfunction once( self ) {\n\t\treturn validateThenCall( \"once\", self );\n\t}\n\n\tCldr.off = off( globalEe );\n\tCldr.on = on( globalEe );\n\tCldr.once = once( globalEe );\n\n\t/**\n\t * Overload Cldr.prototype.init().\n\t */\n\tsuperInit = Cldr.prototype.init;\n\tCldr.prototype.init = function() {\n\t\tvar ee;\n\t\tthis.ee = ee = new EventEmitter();\n\t\tthis.off = off( ee );\n\t\tthis.on = on( ee );\n\t\tthis.once = once( ee );\n\t\tsuperInit.apply( this, arguments );\n\t};\n\n\t/**\n\t * getOverload is encapsulated, because of cldr/unresolved. If it's loaded\n\t * after cldr/event (and note it overwrites .get), it can trigger this\n\t * overload again.\n\t */\n\tfunction getOverload() {\n\n\t\t/**\n\t\t * Overload Cldr.prototype.get().\n\t\t */\n\t\tsuperGet = Cldr.prototype.get;\n\t\tCldr.prototype.get = function( path ) {\n\t\t\tvar value = superGet.apply( this, arguments );\n\t\t\tpath = pathNormalize( path, this.attributes ).join( \"/\" );\n\t\t\tglobalEe.trigger( \"get\", [ path, value ] );\n\t\t\tthis.ee.trigger( \"get\", [ path, value ] );\n\t\t\treturn value;\n\t\t};\n\t}\n\n\tCldr._eventInit = getOverload;\n\tgetOverload();\n\n\treturn Cldr;\n\n\n\n\n}));\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( [ \"../cldr\" ], factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory( require( \"../cldr\" ) );\n\t} else {\n\t\t// Global\n\t\tfactory( Cldr );\n\t}\n\n}(function( Cldr ) {\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tvar alwaysArray = Cldr._alwaysArray;\n\n\n\n\tvar supplementalMain = function( cldr ) {\n\n\t\tvar prepend, supplemental;\n\t\t\n\t\tprepend = function( prepend ) {\n\t\t\treturn function( path ) {\n\t\t\t\tpath = alwaysArray( path );\n\t\t\t\treturn cldr.get( [ prepend ].concat( path ) );\n\t\t\t};\n\t\t};\n\n\t\tsupplemental = prepend( \"supplemental\" );\n\n\t\t// Week Data\n\t\t// http://www.unicode.org/reports/tr35/tr35-dates.html#Week_Data\n\t\tsupplemental.weekData = prepend( \"supplemental/weekData\" );\n\n\t\tsupplemental.weekData.firstDay = function() {\n\t\t\treturn cldr.get( \"supplemental/weekData/firstDay/{territory}\" ) ||\n\t\t\t\tcldr.get( \"supplemental/weekData/firstDay/001\" );\n\t\t};\n\n\t\tsupplemental.weekData.minDays = function() {\n\t\t\tvar minDays = cldr.get( \"supplemental/weekData/minDays/{territory}\" ) ||\n\t\t\t\tcldr.get( \"supplemental/weekData/minDays/001\" );\n\t\t\treturn parseInt( minDays, 10 );\n\t\t};\n\n\t\t// Time Data\n\t\t// http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Data\n\t\tsupplemental.timeData = prepend( \"supplemental/timeData\" );\n\n\t\tsupplemental.timeData.allowed = function() {\n\t\t\treturn cldr.get( \"supplemental/timeData/{territory}/_allowed\" ) ||\n\t\t\t\tcldr.get( \"supplemental/timeData/001/_allowed\" );\n\t\t};\n\n\t\tsupplemental.timeData.preferred = function() {\n\t\t\treturn cldr.get( \"supplemental/timeData/{territory}/_preferred\" ) ||\n\t\t\t\tcldr.get( \"supplemental/timeData/001/_preferred\" );\n\t\t};\n\n\t\treturn supplemental;\n\n\t};\n\n\n\n\n\tvar initSuper = Cldr.prototype.init;\n\n\t/**\n\t * .init() automatically ran on construction.\n\t *\n\t * Overload .init().\n\t */\n\tCldr.prototype.init = function() {\n\t\tinitSuper.apply( this, arguments );\n\t\tthis.supplemental = supplementalMain( this );\n\t};\n\n\treturn Cldr;\n\n\n\n\n}));\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( [ \"../cldr\" ], factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory( require( \"../cldr\" ) );\n\t} else {\n\t\t// Global\n\t\tfactory( Cldr );\n\t}\n\n}(function( Cldr ) {\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tvar coreLoad = Cldr._coreLoad;\n\tvar jsonMerge = Cldr._jsonMerge;\n\tvar pathNormalize = Cldr._pathNormalize;\n\tvar resourceGet = Cldr._resourceGet;\n\tvar validatePresence = Cldr._validatePresence;\n\tvar validateTypePath = Cldr._validateTypePath;\n\n\n\n\tvar bundleParentLookup = function( Cldr, locale ) {\n\t\tvar normalizedPath, parent;\n\n\t\tif ( locale === \"root\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// First, try to find parent on supplemental data.\n\t\tnormalizedPath = pathNormalize( [ \"supplemental/parentLocales/parentLocale\", locale ] );\n\t\tparent = resourceGet( Cldr._resolved, normalizedPath ) || resourceGet( Cldr._raw, normalizedPath );\n\t\tif ( parent ) {\n\t\t\treturn parent;\n\t\t}\n\n\t\t// Or truncate locale.\n\t\tparent = locale.substr( 0, locale.lastIndexOf( Cldr.localeSep ) );\n\t\tif ( !parent ) {\n\t\t\treturn \"root\";\n\t\t}\n\n\t\treturn parent;\n\t};\n\n\n\n\n\t// @path: normalized path\n\tvar resourceSet = function( data, path, value ) {\n\t\tvar i,\n\t\t\tnode = data,\n\t\t\tlength = path.length;\n\n\t\tfor ( i = 0; i < length - 1; i++ ) {\n\t\t\tif ( !node[ path[ i ] ] ) {\n\t\t\t\tnode[ path[ i ] ] = {};\n\t\t\t}\n\t\t\tnode = node[ path[ i ] ];\n\t\t}\n\t\tnode[ path[ i ] ] = value;\n\t};\n\n\n\tvar itemLookup = (function() {\n\n\tvar lookup;\n\n\tlookup = function( Cldr, locale, path, attributes, childLocale ) {\n\t\tvar normalizedPath, parent, value;\n\n\t\t// 1: Finish recursion\n\t\t// 2: Avoid infinite loop\n\t\tif ( typeof locale === \"undefined\" /* 1 */ || locale === childLocale /* 2 */ ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve path\n\t\tnormalizedPath = pathNormalize( path, attributes );\n\n\t\t// Check resolved (cached) data first\n\t\t// 1: Due to #16, never use the cached resolved non-leaf nodes. It may not\n\t\t// represent its leafs in its entirety.\n\t\tvalue = resourceGet( Cldr._resolved, normalizedPath );\n\t\tif ( value !== undefined && typeof value !== \"object\" /* 1 */ ) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Check raw data\n\t\tvalue = resourceGet( Cldr._raw, normalizedPath );\n\n\t\tif ( value === undefined ) {\n\t\t\t// Or, lookup at parent locale\n\t\t\tparent = bundleParentLookup( Cldr, locale );\n\t\t\tvalue = lookup( Cldr, parent, path, jsonMerge( attributes, { bundle: parent }), locale );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\t// Set resolved (cached)\n\t\t\tresourceSet( Cldr._resolved, normalizedPath, value );\n\t\t}\n\n\t\treturn value;\n\t};\n\n\treturn lookup;\n\n}());\n\n\n\tCldr._raw = {};\n\n\t/**\n\t * Cldr.load( json [, json, ...] )\n\t *\n\t * @json [JSON] CLDR data or [Array] Array of @json's.\n\t *\n\t * Load resolved or unresolved cldr data.\n\t * Overwrite Cldr.load().\n\t */\n\tCldr.load = function() {\n\t\tCldr._raw = coreLoad( Cldr, Cldr._raw, arguments );\n\t};\n\n\t/**\n\t * Overwrite Cldr.prototype.get().\n\t */\n\tCldr.prototype.get = function( path ) {\n\t\tvalidatePresence( path, \"path\" );\n\t\tvalidateTypePath( path, \"path\" );\n\n\t\t// 1: use bundle as locale on item lookup for simplification purposes, because no other extended subtag is used anyway on bundle parent lookup.\n\t\t// 2: during init(), this method is called, but bundle is yet not defined. Use \"\" as a workaround in this very specific scenario.\n\t\treturn itemLookup( Cldr, this.attributes && this.attributes.bundle /* 1 */ || \"\" /* 2 */, path, this.attributes );\n\t};\n\n\t// In case cldr/unresolved is loaded after cldr/event, we trigger its overloads again. Because, .get is overwritten in here.\n\tif ( Cldr._eventInit ) {\n\t\tCldr._eventInit();\n\t}\n\n\treturn Cldr;\n\n\n\n\n}));\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n\n// Cldr\nmodule.exports = require( \"./cldr\" );\n\n// Extent Cldr with the following modules\nrequire( \"./cldr/event\" );\nrequire( \"./cldr/supplemental\" );\nrequire( \"./cldr/unresolved\" );\n","/*\n* @copyright (c) 2020, Philipp Thuerwaechter & Pattrick Hueper\n* @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n*/\n\nimport cldrData from 'cldr-data';\nimport Cldr from 'cldrjs';\n\nconst cldrDataLoaded = new Set();\n/**\n * @private\n *\n* Loads the Cldr data for the given path if it hasn't been loaded before.\n*/\nexport const loadCldrData = (path) => {\n if (!cldrDataLoaded.has(path)) {\n Cldr.load(cldrData(path));\n cldrDataLoaded.add(path);\n }\n};\n\nconst localeToCldrInstanceCache = {};\n/**\n * @private\n *\n* Returns a Cldr instance for the given locale.\n* Memoized, so a given locale will always return the exact same cldr instance.\n*/\nexport const getOrCreateCldrInstance = (locale) => {\n if (localeToCldrInstanceCache[locale] == null) {\n localeToCldrInstanceCache[locale] = new Cldr(locale);\n }\n\n return localeToCldrInstanceCache[locale];\n};\n\nconst localeToMapZonesCache = {};\n/**\n * @private\n *\n* Returns a map zones object for a Cldr instance.\n* Memoized, so for any given Cldr instance locale, the same object will be returned.\n*/\nexport const getOrCreateMapZones = (cldr) => {\n if (localeToMapZonesCache[cldr.locale] == null) {\n const mapZones = {};\n\n cldr.get('supplemental/metaZones/metazones').forEach((metaZone) => {\n if (metaZone.mapZone) {\n if (!mapZones[metaZone.mapZone._other]) {\n mapZones[metaZone.mapZone._other] = {};\n }\n mapZones[metaZone.mapZone._other][metaZone.mapZone._territory] = metaZone.mapZone._type;\n }\n });\n\n localeToMapZonesCache[cldr.locale] = mapZones;\n }\n\n return localeToMapZonesCache[cldr.locale];\n};\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\nimport { ChronoField, IsoFields, TextStyle } from '@js-joda/core';\n\nimport cldrData from 'cldr-data';\n\nimport { LocaleStore, createEntry } from '../LocaleStore';\nimport { getOrCreateCldrInstance, loadCldrData } from './CldrCache';\n\n/**\n * The Service Provider Implementation to obtain date-time text for a field.\n * <p>\n * This implementation is based on data from cldr.\n *\n * @private\n */\nexport default class CldrDateTimeTextProvider {\n\n constructor() {\n this._cache = {};\n loadCldrData('supplemental/likelySubtags.json');\n }\n\n //-----------------------------------------------------------------------\n getAvailableLocales() {\n return cldrData('availableLocales.json').availableLocales;\n }\n\n //-----------------------------------------------------------------------\n getText(field, value, style, locale) {\n const store = this._findStore(field, locale);\n if (store instanceof LocaleStore) {\n return store.getText(value, style);\n }\n return null;\n }\n\n getTextIterator(field, style, locale) {\n const store = this._findStore(field, locale);\n if (store instanceof LocaleStore) {\n return store.getTextIterator(style);\n }\n return null;\n }\n\n //-----------------------------------------------------------------------\n _findStore(field, locale) {\n const key = createEntry(field, locale);\n let store = this._cache[key];\n if (store === undefined) {\n store = this._createStore(field, locale);\n this._cache[key] = store;\n }\n return store;\n }\n\n _createStore(field, locale) {\n loadCldrData(`main/${locale.localeString()}/ca-gregorian.json`);\n const cldr = getOrCreateCldrInstance(locale.localeString());\n if (field === ChronoField.MONTH_OF_YEAR) {\n const monthsData = cldr.main('dates/calendars/gregorian/months/format');\n const styleMap = {};\n let data = {};\n data[1] = monthsData.wide[1];\n data[2] = monthsData.wide[2];\n data[3] = monthsData.wide[3];\n data[4] = monthsData.wide[4];\n data[5] = monthsData.wide[5];\n data[6] = monthsData.wide[6];\n data[7] = monthsData.wide[7];\n data[8] = monthsData.wide[8];\n data[9] = monthsData.wide[9];\n data[10] = monthsData.wide[10];\n data[11] = monthsData.wide[11];\n data[12] = monthsData.wide[12];\n styleMap[TextStyle.FULL] = data;\n\n data = {};\n data[1] = monthsData.narrow[1];\n data[2] = monthsData.narrow[2];\n data[3] = monthsData.narrow[3];\n data[4] = monthsData.narrow[4];\n data[5] = monthsData.narrow[5];\n data[6] = monthsData.narrow[6];\n data[7] = monthsData.narrow[7];\n data[8] = monthsData.narrow[8];\n data[9] = monthsData.narrow[9];\n data[10] = monthsData.narrow[10];\n data[11] = monthsData.narrow[11];\n data[12] = monthsData.narrow[12];\n styleMap[TextStyle.NARROW] = data;\n\n data = {};\n data[1] = monthsData.abbreviated[1];\n data[2] = monthsData.abbreviated[2];\n data[3] = monthsData.abbreviated[3];\n data[4] = monthsData.abbreviated[4];\n data[5] = monthsData.abbreviated[5];\n data[6] = monthsData.abbreviated[6];\n data[7] = monthsData.abbreviated[7];\n data[8] = monthsData.abbreviated[8];\n data[9] = monthsData.abbreviated[9];\n data[10] = monthsData.abbreviated[10];\n data[11] = monthsData.abbreviated[11];\n data[12] = monthsData.abbreviated[12];\n styleMap[TextStyle.SHORT] = data;\n return this._createLocaleStore(styleMap);\n }\n if (field === ChronoField.DAY_OF_WEEK) {\n const daysData = cldr.main('dates/calendars/gregorian/days/format');\n const styleMap = {};\n let data = {};\n data[1] = daysData.wide.mon;\n data[2] = daysData.wide.tue;\n data[3] = daysData.wide.wed;\n data[4] = daysData.wide.thu;\n data[5] = daysData.wide.fri;\n data[6] = daysData.wide.sat;\n data[7] = daysData.wide.sun;\n styleMap[TextStyle.FULL] = data;\n\n data = {};\n data[1] = daysData.narrow.mon;\n data[2] = daysData.narrow.tue;\n data[3] = daysData.narrow.wed;\n data[4] = daysData.narrow.thu;\n data[5] = daysData.narrow.fri;\n data[6] = daysData.narrow.sat;\n data[7] = daysData.narrow.sun;\n styleMap[TextStyle.NARROW] = data;\n\n data = {};\n data[1] = daysData.abbreviated.mon;\n data[2] = daysData.abbreviated.tue;\n data[3] = daysData.abbreviated.wed;\n data[4] = daysData.abbreviated.thu;\n data[5] = daysData.abbreviated.fri;\n data[6] = daysData.abbreviated.sat;\n data[7] = daysData.abbreviated.sun;\n styleMap[TextStyle.SHORT] = data;\n return this._createLocaleStore(styleMap);\n }\n if (field === ChronoField.AMPM_OF_DAY) {\n const dayPeriodsData = cldr.main('dates/calendars/gregorian/dayPeriods/format');\n const styleMap = {};\n let data = {};\n data[0] = dayPeriodsData.wide.am;\n data[1] = dayPeriodsData.wide.pm;\n styleMap[TextStyle.FULL] = data;\n\n data = {};\n data[0] = dayPeriodsData.narrow.am;\n data[1] = dayPeriodsData.narrow.pm;\n styleMap[TextStyle.NARROW] = data;\n\n data = {};\n data[0] = dayPeriodsData.abbreviated.am;\n data[1] = dayPeriodsData.abbreviated.pm;\n styleMap[TextStyle.SHORT] = data;\n\n return this._createLocaleStore(styleMap);\n }\n if (field === ChronoField.ERA) {\n const erasData = cldr.main('dates/calendars/gregorian/eras');\n const styleMap = {};\n let data = {};\n data[0] = erasData.eraNames['0'];\n data[1] = erasData.eraNames['1'];\n styleMap[TextStyle.FULL] = data;\n\n data = {};\n data[0] = erasData.eraNarrow['0'];\n data[1] = erasData.eraNarrow['1'];\n styleMap[TextStyle.NARROW] = data;\n\n data = {};\n data[0] = erasData.eraAbbr['0'];\n data[1] = erasData.eraAbbr['1'];\n styleMap[TextStyle.SHORT] = data;\n\n return this._createLocaleStore(styleMap);\n }\n if (field === IsoFields.QUARTER_OF_YEAR) {\n const quartersData = cldr.main('dates/calendars/gregorian/quarters/format');\n const styleMap = {};\n let data = {};\n data[1] = quartersData.wide['1'];\n data[2] = quartersData.wide['2'];\n data[3] = quartersData.wide['3'];\n data[4] = quartersData.wide['4'];\n styleMap[TextStyle.FULL] = data;\n\n data = {};\n data[1] = quartersData.narrow['1'];\n data[2] = quartersData.narrow['2'];\n data[3] = quartersData.narrow['3'];\n data[4] = quartersData.narrow['4'];\n styleMap[TextStyle.NARROW] = data;\n\n data = {};\n data[1] = quartersData.abbreviated['1'];\n data[2] = quartersData.abbreviated['2'];\n data[3] = quartersData.abbreviated['3'];\n data[4] = quartersData.abbreviated['4'];\n styleMap[TextStyle.SHORT] = data;\n\n return this._createLocaleStore(styleMap);\n }\n return null; // null marker for map\n }\n\n //-----------------------------------------------------------------------\n _createLocaleStore(valueTextMap) {\n valueTextMap[TextStyle.FULL_STANDALONE] = valueTextMap[TextStyle.FULL];\n valueTextMap[TextStyle.SHORT_STANDALONE] = valueTextMap[TextStyle.SHORT];\n /* istanbul ignore if */ // this doesn't seem to happen?\n if (Object.keys(valueTextMap).indexOf(TextStyle.NARROW) > -1\n && Object.keys(valueTextMap).indexOf(TextStyle.NARROW_STANDALONE) === -1) {\n valueTextMap[TextStyle.NARROW_STANDALONE] = valueTextMap[TextStyle.NARROW];\n }\n return new LocaleStore(valueTextMap);\n }\n}\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\nimport {\n _ as jodaInternal,\n TextStyle,\n TemporalQueries,\n ZoneId,\n ZoneOffset,\n ZoneRulesProvider,\n} from '@js-joda/core';\n\nimport { getOrCreateCldrInstance, getOrCreateMapZones, loadCldrData } from './CldrCache';\n\nconst { assert: { requireNonNull, requireInstance } } = jodaInternal;\n\n//-----------------------------------------------------------------------\nconst LENGTH_COMPARATOR = (str1, str2) => {\n let cmp = str2.length - str1.length;\n if (cmp === 0) {\n cmp = str1.localeCompare(str2);\n }\n return cmp;\n};\n\n/**\n * Cache for `_cachedResolveZoneIdText`.\n *\n * Its basic structure is:\n * Obj { locale: zoneId }\n * Obj { zoneId: style}\n * Obj { style: type}\n * Obj { type: resolvedZoneIdText}\n */\nconst resolveZoneIdTextCache = {};\n\n/**\n * Prints or parses a zone ID.\n */\nexport default class CldrZoneTextPrinterParser {\n /** The text style to output. */\n\n constructor(textStyle) {\n requireNonNull(textStyle, 'textStyle');\n requireInstance(textStyle, TextStyle, 'textStyle');\n this._textStyle = textStyle;\n this._zoneIdsLocales = {};\n loadCldrData('supplemental/likelySubtags.json');\n loadCldrData('supplemental/metaZones.json');\n }\n\n _cachedResolveZoneIdText(cldr, zoneId, style, type) {\n if (resolveZoneIdTextCache[cldr.locale] == null) {\n resolveZoneIdTextCache[cldr.locale] = {};\n }\n\n const zoneIdToStyle = resolveZoneIdTextCache[cldr.locale];\n if (zoneIdToStyle[zoneId] == null) {\n zoneIdToStyle[zoneId] = {};\n }\n\n const styleToType = zoneIdToStyle[zoneId];\n if (styleToType[style] == null) {\n styleToType[style] = {};\n }\n\n const typeToResolvedZoneIdText = styleToType[style];\n if (typeToResolvedZoneIdText[type] == null) {\n typeToResolvedZoneIdText[type] = this._resolveZoneIdText(cldr, zoneId, style, type);\n }\n\n return typeToResolvedZoneIdText[type];\n }\n\n _resolveZoneIdText(cldr, zoneId, style, type) {\n const zoneData = cldr.main(`dates/timeZoneNames/zone/${zoneId}/${style}/${type}`);\n if (zoneData) {\n return zoneData;\n } else {\n const metazoneInfo = cldr.get(`supplemental/metaZones/metazoneInfo/timezone/${zoneId}`);\n if (metazoneInfo) {\n // const zoneData = cldr.main(`dates/timeZoneNames/metazone/Acre`);\n // TODO: determine metaZone for current temporal, for now, we use the last one :/\n const metazone = metazoneInfo[metazoneInfo.length - 1]['usesMetazone']['_mzone'];\n let metaZoneData = cldr.main(`dates/timeZoneNames/metazone/${metazone}/${style}/${type}`);\n if (metaZoneData) {\n return metaZoneData;\n } else {\n // type fallback, first generic, then standard\n metaZoneData = cldr.main(`dates/timeZoneNames/metazone/${metazone}/${style}/generic`);\n if (!metaZoneData) {\n metaZoneData = cldr.main(`dates/timeZoneNames/metazone/${metazone}/${style}/standard`);\n }\n if (metaZoneData) {\n return metaZoneData;\n } else {\n const mapZones = getOrCreateMapZones(cldr);\n // find preferred Zone and resolve again\n const preferredZone = mapZones[metazone][cldr.attributes.territory];\n if (preferredZone) {\n if (preferredZone !== zoneId) {\n return this._cachedResolveZoneIdText(cldr, preferredZone, style, type);\n }\n } else {\n // find golden Zone and resolve again\n const goldenZone = mapZones[metazone]['001'];\n if (goldenZone !== zoneId) {\n return this._cachedResolveZoneIdText(cldr, goldenZone, style, type);\n }\n }\n }\n }\n }\n }\n }\n\n //-----------------------------------------------------------------------\n print(context, buf) {\n\n //see http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Zone_Names\n\n const zone = context.getValueQuery(TemporalQueries.zoneId());\n /* istanbul ignore if */ // shouldn't happen... getValueQuery throws before returning null\n if (zone == null) {\n return false;\n }\n if (zone.normalized() instanceof ZoneOffset) {\n buf.append(zone.id());\n return true;\n }\n const daylight = false;\n const hasDaylightSupport = false;\n /* TODO: currently js-joda-timezone does not support ZoneRules.isDaylightSavings() ... uncomment if it does\n const temporal = context.temporal();\n if (temporal.isSupported(ChronoField.INSTANT_SECONDS)) {\n hasDaylightSupport = true;\n const instant = Instant.ofEpochSecond(temporal.getLong(ChronoField.INSTANT_SECONDS));\n daylight = zone.rules().isDaylightSavings(instant);\n }*/\n const tzType = hasDaylightSupport ? (daylight ? 'daylight' : 'standard') : 'generic';\n const tzstyle = (this._textStyle.asNormal() === TextStyle.FULL ? 'long' : 'short');\n loadCldrData(`main/${context.locale().localeString()}/timeZoneNames.json`);\n const cldr = getOrCreateCldrInstance(context.locale().localeString());\n\n const text = this._cachedResolveZoneIdText(cldr, zone.id(), tzstyle, tzType);\n if (text) {\n buf.append(text);\n } else {\n // fallback, print zoneId\n buf.append(zone.id());\n }\n return true;\n }\n\n _resolveZoneIds(localString) {\n if(this._zoneIdsLocales[localString] != null) {\n return this._zoneIdsLocales[localString];\n }\n const ids = {};\n loadCldrData(`main/${localString}/timeZoneNames.json`);\n const cldr = getOrCreateCldrInstance(localString);\n\n for (const id of ZoneRulesProvider.getAvailableZoneIds()) {\n ids[id] = id;\n const tzstyle = (this._textStyle.asNormal() === TextStyle.FULL ? 'long' : 'short');\n\n const genericText = this._cachedResolveZoneIdText(cldr, id, tzstyle, 'generic');\n if (genericText) {\n ids[genericText] = id;\n }\n const standardText = this._cachedResolveZoneIdText(cldr, id, tzstyle, 'standard');\n if (standardText) {\n ids[standardText] = id;\n }\n const daylightText = this._cachedResolveZoneIdText(cldr, id, tzstyle, 'daylight');\n if (daylightText) {\n ids[daylightText] = id;\n }\n }\n // threeten is using a (sorted) TreeMap... so we need to sort the keys\n const sortedKeys = Object.keys(ids).sort(LENGTH_COMPARATOR);\n\n this._zoneIdsLocales[localString] = { ids, sortedKeys };\n return this._zoneIdsLocales[localString];\n }\n\n // That's a very poor implementation, there are missing bug fixes and functionality from threeten and jdk\n parse(context, text, position) {\n for (const name of ['UTC', 'GMT']) {\n if (context.subSequenceEquals(text, position, name, 0, name.length)) {\n context.setParsedZone(ZoneId.of(name));\n return position + name.length;\n }\n }\n const { ids, sortedKeys } = this._resolveZoneIds(context.locale().localeString());\n for (const name of sortedKeys) {\n if (context.subSequenceEquals(text, position, name, 0, name.length)) {\n context.setParsedZone(ZoneId.of(ids[name]));\n return position + name.length;\n }\n }\n return ~position;\n }\n\n toString() {\n return `ZoneText(${this._textStyle})`;\n }\n}\n","/**\n * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper\n * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos\n * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)\n */\n\nimport {\n _ as jodaInternal,\n DateTimeFormatterBuilder,\n ChronoField,\n TextStyle\n} from '@js-joda/core';\n\nconst { MathUtil } = jodaInternal;\n//-----------------------------------------------------------------------\n/**\n * Prints or parses field text.\n * @private\n */\nexport default class LocalizedOffsetPrinterParser {\n /**\n * Constructor.\n *\n * @param {!TextStyle} textStyle the text style, not null\n */\n constructor(textStyle) {\n this._textStyle = textStyle;\n }\n\n textStyle() {\n return this._textStyle;\n }\n\n print(context, buf) {\n const offsetSecs = context.getValue(ChronoField.OFFSET_SECONDS);\n /* istanbul ignore if */ // shouldn't happen... getValue throws for unsupported fields?\n if (offsetSecs == null) {\n return false;\n }\n buf.append('GMT');\n if (this._textStyle === TextStyle.FULL) {\n return new DateTimeFormatterBuilder.OffsetIdPrinterParser('', '+HH:MM:ss').print(context, buf);\n }\n const totalSecs = MathUtil.safeToInt(offsetSecs);\n if (totalSecs !== 0) {\n const absHours = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 3600), 100)); // anything larger than 99 silently dropped\n const absMinutes = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs,60), 60));\n const absSeconds = Math.abs(MathUtil.intMod(totalSecs, 60));\n buf.append(totalSecs < 0 ? '-' : '+').append(absHours);\n if (absMinutes > 0 || absSeconds > 0) {\n buf.append(':')\n .append(MathUtil.intDiv(absMinutes, 10)).append(MathUtil.intMod(absMinutes,10));\n if (absSeconds > 0) {\n buf.append(':')\n .append(MathUtil.intDiv(absSeconds, 10)).append(MathUtil.intMod(absSeconds, 10));\n }\n }\n }\n return true;\n }\n\n parse(context, text, position) {\n if (context.subSequenceEquals(text, position, 'GMT', 0, 3) === false) {\n return ~position;\n }\n position += 3;\n if (this._textStyle === TextStyle.FULL) {\n return new DateTimeFormatterBuilder.OffsetIdPrinterParser('', '+HH:MM:ss').parse(context, text, position);\n }\n const end = text.length;\n if (position === end) {\n return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position);\n }\n const sign = text.charAt(position);\n if (sign !== '+' && sign !== '-') {\n return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position);\n }\n const negative = (sign === '-' ? -1 : 1);\n /* istanbul ignore if */ // cannot happen, already checked before\n if (position === end) {\n return ~position;\n }\n position++;\n // hour\n let ch = text.charAt(position);\n if (ch < '0' || ch > '9') {\n return ~position;\n }\n position++;\n let hour = MathUtil.parseInt(ch);\n if (position !== end) {\n ch = text.charAt(position);\n if (ch >= '0' && ch <= '9') {\n hour = hour * 10 + MathUtil.parseInt(ch);\n if (hour > 23) {\n return ~position;\n }\n position++;\n }\n }\n if (position === end || text.charAt(position) !== ':') {\n const offset = negative * 3600 * hour;\n return context.setParsedField(ChronoField.OFFSET_SECONDS, offset, position, position);\n }\n position++;\n // minute\n if (position > end - 2) {\n return ~position;\n }\n ch = text.charAt(position);\n if (ch < '0' || ch > '9') {\n return ~position;\n }\n position++;\n let min = MathUtil.parseInt(ch);\n ch = text.charAt(position);\n if (ch < '0' || ch > '9') {\n return ~position;\n }\n position++;\n min = min * 10 + MathUtil.parseInt(ch);\n if (min > 59) {\n return ~position;\n }\n if (position === end || text.charAt(position) !== ':') {\n const offset = negative * (3600 * hour + 60 * min);\n return context.setParsedField(ChronoField.OFFSET_SECONDS, offset, position, position);\n }\n position++;\n // second\n if (position > end - 2) {\n return ~position;\n }\n ch = text.charAt(position);\n if (ch < '0' || ch > '9') {\n return ~position;\n }\n position++;\n let sec = MathUtil.parseInt(ch);\n ch = text.charAt(position);\n if (ch < '0' || ch > '9') {\n return ~position;\n }\n position++;\n sec = sec * 10 + MathUtil.parseInt(ch);\n if (sec > 59) {\n return ~position;\n }\n const offset = negative * (3600 * hour + 60 * min + sec);\n return context.setParsedField(ChronoField.OFFSET_SECONDS, offset, position, position);\n }\n\n toString() {\n return `LocalizedOffset(${this._textStyle})`;\n }\n\n}\n\n//-----------------------------------------------------------------------\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\nimport {\n _ as jodaInternal,\n DateTimeException,\n DayOfWeek,\n ChronoField,\n ChronoUnit,\n IllegalArgumentException,\n IllegalStateException,\n IsoChronology,\n IsoFields,\n LocalDate,\n ResolverStyle,\n ValueRange,\n Year\n} from '@js-joda/core';\nimport cldrData from 'cldr-data';\nimport Cldr from 'cldrjs';\n\nconst { MathUtil, assert: { requireNonNull, requireInstance } } = jodaInternal;\n\n//-----------------------------------------------------------------------\nconst DAY_OF_WEEK_RANGE = ValueRange.of(1, 7);\nconst WEEK_OF_MONTH_RANGE = ValueRange.of(0, 1, 4, 6);\nconst WEEK_OF_YEAR_RANGE = ValueRange.of(0, 1, 52, 54);\nconst WEEK_OF_WEEK_BASED_YEAR_RANGE = ValueRange.of(1, 52, 53);\nconst WEEK_BASED_YEAR_RANGE = ChronoField.YEAR.range();\n\n/* map from the string from cldr `firstDay()` to DayOfWeek */\nconst _weekDayMap = {\n 'mon': DayOfWeek.MONDAY,\n 'tue': DayOfWeek.TUESDAY,\n 'wed': DayOfWeek.WEDNESDAY,\n 'thu': DayOfWeek.THURSDAY,\n 'fri': DayOfWeek.FRIDAY,\n 'sat': DayOfWeek.SATURDAY,\n 'sun': DayOfWeek.SUNDAY,\n};\n\n/**\n * Field type that computes DayOfWeek, WeekOfMonth, and WeekOfYear\n * based on a WeekFields.\n * A separate Field instance is required for each different WeekFields;\n * combination of start of week and minimum number of days.\n * Constructors are provided to create fields for DayOfWeek, WeekOfMonth,\n * and WeekOfYear.\n */\nexport class ComputedDayOfField {\n\n /**\n * Returns a field to access the day of week,\n * computed based on a WeekFields.\n * <p>\n * The WeekDefintion of the first day of the week is used with\n * the ISO DAY_OF_WEEK field to compute week boundaries.\n */\n static ofDayOfWeekField(weekDef) {\n return new ComputedDayOfField('DayOfWeek', weekDef,\n ChronoUnit.DAYS, ChronoUnit.WEEKS, DAY_OF_WEEK_RANGE);\n }\n\n /**\n * Returns a field to access the week of month,\n * computed based on a WeekFields.\n * @see WeekFields#weekOfMonth()\n */\n static ofWeekOfMonthField(weekDef) {\n return new ComputedDayOfField('WeekOfMonth', weekDef,\n ChronoUnit.WEEKS, ChronoUnit.MONTHS, WEEK_OF_MONTH_RANGE);\n }\n\n /**\n * Returns a field to access the week of year,\n * computed based on a WeekFields.\n * @see WeekFields#weekOfYear()\n */\n static ofWeekOfYearField(weekDef) {\n return new ComputedDayOfField('WeekOfYear', weekDef,\n ChronoUnit.WEEKS, ChronoUnit.YEARS, WEEK_OF_YEAR_RANGE);\n }\n\n /**\n * Returns a field to access the week of week-based-year,\n * computed based on a WeekFields.\n * @see WeekFields#weekOfWeekBasedYear()\n */\n static ofWeekOfWeekBasedYearField(weekDef) {\n return new ComputedDayOfField('WeekOfWeekBasedYear', weekDef,\n ChronoUnit.WEEKS, IsoFields.WEEK_BASED_YEARS, WEEK_OF_WEEK_BASED_YEAR_RANGE);\n }\n\n /**\n * Returns a field to access the week-based-year,\n * computed based on a WeekFields.\n * @see WeekFields#weekBasedYear()\n */\n static ofWeekBasedYearField(weekDef) {\n return new ComputedDayOfField('WeekBasedYear', weekDef,\n IsoFields.WEEK_BASED_YEARS, ChronoUnit.FOREVER, WEEK_BASED_YEAR_RANGE);\n }\n\n /**\n *@private\n */\n constructor(name, weekDef, baseUnit, rangeUnit, range) {\n this._name = name;\n this._weekDef = weekDef;\n this._baseUnit = baseUnit;\n this._rangeUnit = rangeUnit;\n this._range = range;\n }\n\n getFrom(temporal) {\n // Offset the ISO DOW by the start of this week\n const sow = this._weekDef.firstDayOfWeek().value();\n const dow = this._localizedDayOfWeek(temporal, sow);\n\n if (this._rangeUnit === ChronoUnit.WEEKS) {\n return dow;\n } else if (this._rangeUnit === ChronoUnit.MONTHS) {\n return this._localizedWeekOfMonth(temporal, dow);\n } else if (this._rangeUnit === ChronoUnit.YEARS) {\n return this._localizedWeekOfYear(temporal, dow);\n } else if (this._rangeUnit === IsoFields.WEEK_BASED_YEARS) {\n return this._localizedWOWBY(temporal);\n } else if (this._rangeUnit === ChronoUnit.FOREVER) {\n return this._localizedWBY(temporal);\n } else {\n throw new IllegalStateException('unreachable');\n }\n }\n\n _localizedDayOfWeek(temporal, sow) {\n const isoDow = temporal.get(ChronoField.DAY_OF_WEEK);\n return MathUtil.floorMod(isoDow - sow, 7) + 1;\n }\n\n _localizedWeekOfMonth(temporal, dow) {\n const dom = temporal.get(ChronoField.DAY_OF_MONTH);\n const offset = this._startOfWeekOffset(dom, dow);\n return ComputedDayOfField._computeWeek(offset, dom);\n }\n\n _localizedWeekOfYear(temporal, dow) {\n const doy = temporal.get(ChronoField.DAY_OF_YEAR);\n const offset = this._startOfWeekOffset(doy, dow);\n return ComputedDayOfField._computeWeek(offset, doy);\n }\n\n _localizedWOWBY(temporal) {\n const sow = this._weekDef.firstDayOfWeek().value();\n const isoDow = temporal.get(ChronoField.DAY_OF_WEEK);\n const dow = MathUtil.floorMod(isoDow - sow, 7) + 1;\n const woy = this._localizedWeekOfYear(temporal, dow);\n if (woy === 0) {\n const previous = LocalDate.from(temporal).minus(1, ChronoUnit.WEEKS);\n return this._localizedWeekOfYear(previous, dow) + 1;\n } else if (woy >= 53) {\n const offset = this._startOfWeekOffset(temporal.get(ChronoField.DAY_OF_YEAR), dow);\n const year = temporal.get(ChronoField.YEAR);\n const yearLen = Year.isLeap(year) ? 366 : 365;\n const weekIndexOfFirstWeekNextYear = ComputedDayOfField._computeWeek(offset, yearLen + this._weekDef.minimalDaysInFirstWeek());\n if (woy >= weekIndexOfFirstWeekNextYear) {\n return (woy - (weekIndexOfFirstWeekNextYear - 1));\n }\n }\n return woy;\n }\n\n _localizedWBY(temporal) {\n const sow = this._weekDef.firstDayOfWeek().value();\n const isoDow = temporal.get(ChronoField.DAY_OF_WEEK);\n const dow = MathUtil.floorMod(isoDow - sow, 7) + 1;\n const year = temporal.get(ChronoField.YEAR);\n const woy = this._localizedWeekOfYear(temporal, dow);\n if (woy === 0) {\n return year - 1;\n } else if (woy < 53) {\n return year;\n }\n const offset = this._startOfWeekOffset(temporal.get(ChronoField.DAY_OF_YEAR), dow);\n const yearLen = Year.isLeap(year) ? 366 : 365;\n const weekIndexOfFirstWeekNextYear = ComputedDayOfField._computeWeek(offset, yearLen + this._weekDef.minimalDaysInFirstWeek());\n if (woy >= weekIndexOfFirstWeekNextYear) {\n return year + 1;\n }\n return year;\n }\n\n /**\n * Returns an offset to align week start with a day of month or day of year.\n *\n * @param day the day; 1 through infinity\n * @param dow the day of the week of that day; 1 through 7\n * @return an offset in days to align a day with the start of the first 'full' week\n */\n _startOfWeekOffset(day, dow) {\n // offset of first day corresponding to the day of week in first 7 days (zero origin)\n const weekStart = MathUtil.floorMod(day - dow, 7);\n let offset = -weekStart;\n if (weekStart + 1 > this._weekDef.minimalDaysInFirstWeek()) {\n // The previous week has the minimum days in the current month to be a 'week'\n offset = 7 - weekStart;\n }\n return offset;\n }\n\n /**\n * Returns the week number computed from the reference day and reference dayOfWeek.\n *\n * @param offset the offset to align a date with the start of week\n * from {@link #startOfWeekOffset}.\n * @param day the day for which to compute the week number\n * @return the week number where zero is used for a partial week and 1 for the first full week\n */\n static _computeWeek(offset, day) {\n return MathUtil.intDiv((7 + offset + (day - 1)), 7);\n }\n\n adjustInto(temporal, newValue) {\n // Check the new value and get the old value of the field\n const newVal = this._range.checkValidIntValue(newValue, this);\n const currentVal = temporal.get(this);\n if (newVal === currentVal) {\n return temporal;\n }\n if (this._rangeUnit === ChronoUnit.FOREVER) {\n // adjust in whole weeks so dow never changes\n const baseWowby = temporal.get(this._weekDef.weekOfWeekBasedYear());\n const diffWeeks = MathUtil.roundDown((newValue - currentVal) * 52.1775);\n let result = temporal.plus(diffWeeks, ChronoUnit.WEEKS);\n if (result.get(this) > newVal) {\n // ended up in later week-based-year\n // move to last week of previous year\n const newWowby = result.get(this._weekDef.weekOfWeekBasedYear());\n result = result.minus(newWowby, ChronoUnit.WEEKS);\n } else {\n if (result.get(this) < newVal) {\n // ended up in earlier week-based-year\n result = result.plus(2, ChronoUnit.WEEKS);\n }\n // reset the week-of-week-based-year\n const newWowby = result.get(this._weekDef.weekOfWeekBasedYear());\n result = result.plus(baseWowby - newWowby, ChronoUnit.WEEKS);\n if (result.get(this) > newVal) {\n result = result.minus(1, ChronoUnit.WEEKS);\n }\n }\n return result;\n }\n // Compute the difference and add that using the base using of the field\n const delta = newVal - currentVal;\n return temporal.plus(delta, this._baseUnit);\n }\n\n resolve(fieldValues, partialTemporal, resolverStyle) {\n const sow = this._weekDef.firstDayOfWeek().value();\n if (this._rangeUnit === ChronoUnit.WEEKS) { // day-of-week\n const value = fieldValues.remove(this);\n const localDow = this._range.checkValidIntValue(value, this);\n const isoDow = MathUtil.floorMod((sow - 1) + (localDow - 1), 7) + 1;\n fieldValues.put(ChronoField.DAY_OF_WEEK, isoDow);\n return null;\n }\n if (fieldValues.containsKey(ChronoField.DAY_OF_WEEK) === false) {\n return null;\n }\n\n // week-based-year\n if (this._rangeUnit === ChronoUnit.FOREVER) {\n if (fieldValues.containsKey(this._weekDef.weekOfWeekBasedYear()) === false) {\n return null;\n }\n // const chrono = IsoChronology.INSTANCE; //TODO: Chronology.from(partialTemporal); // defaults to ISO\n const isoDow = ChronoField.DAY_OF_WEEK.checkValidIntValue(fieldValues.get(ChronoField.DAY_OF_WEEK));\n const dow = MathUtil.floorMod(isoDow - sow, 7) + 1;\n const wby = this.range().checkValidIntValue(fieldValues.get(this), this);\n let date;\n let days;\n if (resolverStyle === ResolverStyle.LENIENT) {\n date = LocalDate.of(wby, 1, this._weekDef.minimalDaysInFirstWeek()); //TODO: chrono.date(wby, 1, this._weekDef.minimalDaysInFirstWeek());\n const wowby = fieldValues.get(this._weekDef.weekOfWeekBasedYear());\n const dateDow = this._localizedDayOfWeek(date, sow);\n const weeks = wowby - this._localizedWeekOfYear(date, dateDow);\n days = weeks * 7 + (dow - dateDow);\n } else {\n date = LocalDate.of(wby, 1, this._weekDef.minimalDaysInFirstWeek()); //TODO: chrono.date(wby, 1, this._weekDef.minimalDaysInFirstWeek());\n const wowby = this._weekDef.weekOfWeekBasedYear().range().checkValidIntValue(\n fieldValues.get(this._weekDef.weekOfWeekBasedYear()), this._weekDef.weekOfWeekBasedYear);\n const dateDow = this._localizedDayOfWeek(date, sow);\n const weeks = wowby - this._localizedWeekOfYear(date, dateDow);\n days = weeks * 7 + (dow - dateDow);\n }\n date = date.plus(days, ChronoUnit.DAYS);\n if (resolverStyle === ResolverStyle.STRICT) {\n if (date.getLong(this) !== fieldValues.get(this)) {\n throw new DateTimeException('Strict mode rejected date parsed to a different year');\n }\n }\n fieldValues.remove(this);\n fieldValues.remove(this._weekDef.weekOfWeekBasedYear());\n fieldValues.remove(ChronoField.DAY_OF_WEEK);\n return date;\n }\n\n if (fieldValues.containsKey(ChronoField.YEAR) === false) {\n return null;\n }\n const isoDow = ChronoField.DAY_OF_WEEK.checkValidIntValue(fieldValues.get(ChronoField.DAY_OF_WEEK));\n const dow = MathUtil.floorMod(isoDow - sow, 7) + 1;\n const year = ChronoField.YEAR.checkValidIntValue(fieldValues.get(ChronoField.YEAR));\n // const chrono = IsoChronology.INSTANCE; //TODO: Chronology.from(partialTemporal); // defaults to ISO\n if (this._rangeUnit === ChronoUnit.MONTHS) { // week-of-month\n if (fieldValues.containsKey(ChronoField.MONTH_OF_YEAR) === false) {\n return null;\n }\n const value = fieldValues.remove(this);\n let date;\n let days;\n if (resolverStyle === ResolverStyle.LENIENT) {\n const month = fieldValues.get(ChronoField.MONTH_OF_YEAR);\n date = LocalDate.of(year, 1, 1); // TODO: chrono.date(year, 1, 1);\n date = date.plus(month - 1, ChronoUnit.MONTHS);\n const dateDow = this._localizedDayOfWeek(date, sow);\n const weeks = value - this._localizedWeekOfMonth(date, dateDow);\n days = weeks * 7 + (dow - dateDow);\n } else {\n const month = ChronoField.MONTH_OF_YEAR.checkValidIntValue(fieldValues.get(ChronoField.MONTH_OF_YEAR));\n date = LocalDate.of(year, month, 8); // TODO: chrono.date(year, month, 8);\n const dateDow = this._localizedDayOfWeek(date, sow);\n const wom = this._range.checkValidIntValue(value, this);\n const weeks = wom - this._localizedWeekOfMonth(date, dateDow);\n days = weeks * 7 + (dow - dateDow);\n }\n date = date.plus(days, ChronoUnit.DAYS);\n if (resolverStyle === ResolverStyle.STRICT) {\n if (date.getLong(ChronoField.MONTH_OF_YEAR) !== fieldValues.get(ChronoField.MONTH_OF_YEAR)) {\n throw new DateTimeException('Strict mode rejected date parsed to a different month');\n }\n }\n fieldValues.remove(this);\n fieldValues.remove(ChronoField.YEAR);\n fieldValues.remove(ChronoField.MONTH_OF_YEAR);\n fieldValues.remove(ChronoField.DAY_OF_WEEK);\n return date;\n } else if (this._rangeUnit === ChronoUnit.YEARS) { // week-of-year\n const value = fieldValues.remove(this);\n let date = LocalDate.of(year, 1, 1); // TODO: chrono.date(year, 1, 1);\n let days;\n if (resolverStyle === ResolverStyle.LENIENT) {\n const dateDow = this._localizedDayOfWeek(date, sow);\n const weeks = value - this._localizedWeekOfYear(date, dateDow);\n days = weeks * 7 + (dow - dateDow);\n } else {\n const dateDow = this._localizedDayOfWeek(date, sow);\n const woy = this._range.checkValidIntValue(value, this);\n const weeks = woy - this._localizedWeekOfYear(date, dateDow);\n days = weeks * 7 + (dow - dateDow);\n }\n date = date.plus(days, ChronoUnit.DAYS);\n if (resolverStyle === ResolverStyle.STRICT) {\n if (date.getLong(ChronoField.YEAR) !== fieldValues.get(ChronoField.YEAR)) {\n throw new DateTimeException('Strict mode rejected date parsed to a different year');\n }\n }\n fieldValues.remove(this);\n fieldValues.remove(ChronoField.YEAR);\n fieldValues.remove(ChronoField.DAY_OF_WEEK);\n return date;\n } else {\n throw new IllegalStateException('unreachable');\n }\n }\n\n //-----------------------------------------------------------------------\n name() {\n return this._name;\n }\n\n baseUnit() {\n return this._baseUnit;\n }\n\n rangeUnit() {\n return this._rangeUnit;\n }\n\n range() {\n return this._range;\n }\n\n //-----------------------------------------------------------------------\n isDateBased() {\n return true;\n }\n\n isTimeBased() {\n return false;\n }\n\n isSupportedBy(temporal) {\n if (temporal.isSupported(ChronoField.DAY_OF_WEEK)) {\n if (this._rangeUnit === ChronoUnit.WEEKS) {\n return true;\n } else if (this._rangeUnit === ChronoUnit.MONTHS) {\n return temporal.isSupported(ChronoField.DAY_OF_MONTH);\n } else if (this._rangeUnit === ChronoUnit.YEARS) {\n return temporal.isSupported(ChronoField.DAY_OF_YEAR);\n } else if (this._rangeUnit === IsoFields.WEEK_BASED_YEARS) {\n return temporal.isSupported(ChronoField.EPOCH_DAY);\n } else if (this._rangeUnit === ChronoUnit.FOREVER) {\n return temporal.isSupported(ChronoField.EPOCH_DAY);\n }\n }\n return false;\n }\n\n rangeRefinedBy(temporal) {\n if (this._rangeUnit === ChronoUnit.WEEKS) {\n return this._range;\n }\n\n let field = null;\n if (this._rangeUnit === ChronoUnit.MONTHS) {\n field = ChronoField.DAY_OF_MONTH;\n } else if (this._rangeUnit === ChronoUnit.YEARS) {\n field = ChronoField.DAY_OF_YEAR;\n } else if (this._rangeUnit === IsoFields.WEEK_BASED_YEARS) {\n return this._rangeWOWBY(temporal);\n } else if (this._rangeUnit === ChronoUnit.FOREVER) {\n return temporal.range(ChronoField.YEAR);\n } else {\n throw new IllegalStateException('unreachable');\n }\n\n // Offset the ISO DOW by the start of this week\n const sow = this._weekDef.firstDayOfWeek().value();\n const isoDow = temporal.get(ChronoField.DAY_OF_WEEK);\n const dow = MathUtil.floorMod(isoDow - sow, 7) + 1;\n\n const offset = this._startOfWeekOffset(temporal.get(field), dow);\n const fieldRange = temporal.range(field);\n return ValueRange.of(ComputedDayOfField._computeWeek(offset, fieldRange.minimum()),\n ComputedDayOfField._computeWeek(offset, fieldRange.maximum()));\n }\n\n _rangeWOWBY(temporal) {\n const sow = this._weekDef.firstDayOfWeek().value();\n const isoDow = temporal.get(ChronoField.DAY_OF_WEEK);\n const dow = MathUtil.floorMod(isoDow - sow, 7) + 1;\n const woy = this._localizedWeekOfYear(temporal, dow);\n if (woy === 0) {\n // TODO: we use IsoChronology for now\n return this._rangeWOWBY(IsoChronology.INSTANCE.date(temporal).minus(2, ChronoUnit.WEEKS));\n // return this._rangeWOWBY(Chronology.from(temporal).date(temporal).minus(2, ChronoUnit.WEEKS));\n }\n const offset = this._startOfWeekOffset(temporal.get(ChronoField.DAY_OF_YEAR), dow);\n const year = temporal.get(ChronoField.YEAR);\n const yearLen = Year.isLeap(year) ? 366 : 365;\n const weekIndexOfFirstWeekNextYear = ComputedDayOfField._computeWeek(offset, yearLen + this._weekDef.minimalDaysInFirstWeek());\n if (woy >= weekIndexOfFirstWeekNextYear) {\n // TODO: we use IsoChronology for now\n return this._rangeWOWBY(IsoChronology.INSTANCE.date(temporal).plus(2, ChronoUnit.WEEKS));\n // return this._rangeWOWBY(Chronology.from(temporal).date(temporal).plus(2, ChronoUnit.WEEKS));\n }\n return ValueRange.of(1, weekIndexOfFirstWeekNextYear - 1);\n }\n\n displayName(locale) {\n requireNonNull(locale, 'locale');\n if (this._rangeUnit === ChronoUnit.YEARS) { // week-of-year\n return 'Week';\n }\n return this.toString();\n }\n\n //-----------------------------------------------------------------------\n toString() {\n return `${this._name}[${this._weekDef.toString()}]`;\n }\n}\n\n/**\n * The cache of rules by firstDayOfWeek plus minimalDays.\n * Initialized first to be available for definition of ISO, etc.\n */\nconst WeekFieldsCache = new Map();\n\n\n/**\n * Localized definitions of the day-of-week, week-of-month and week-of-year fields.\n * <p>\n * A standard week is seven days long, but cultures have different definitions for some\n * other aspects of a week. This class represents the definition of the week, for the\n * purpose of providing {@link TemporalField} instances.\n * <p>\n * WeekFields provides three fields,\n * {@link #dayOfWeek()}, {@link #weekOfMonth()}, and {@link #weekOfYear()}\n * that provide access to the values from any {@link Temporal temporal object}.\n * <p>\n * The computations for day-of-week, week-of-month, and week-of-year are based\n * on the {@link ChronoField#YEAR proleptic-year},\n * {@link ChronoField#MONTH_OF_YEAR month-of-year},\n * {@link ChronoField#DAY_OF_MONTH day-of-month}, and\n * {@link ChronoField#DAY_OF_WEEK ISO day-of-week} which are based on the\n * {@link ChronoField#EPOCH_DAY epoch-day} and the chronology.\n * The values may not be aligned with the {@link ChronoField#YEAR_OF_ERA year-of-Era}\n * depending on the Chronology.\n * <p>A week is defined by:\n * <ul>\n * <li>The first day-of-week.\n * For example, the ISO-8601 standard considers Monday to be the first day-of-week.\n * <li>The minimal number of days in the first week.\n * For example, the ISO-8601 standard counts the first week as needing at least 4 days.\n * </ul><p>\n * Together these two values allow a year or month to be divided into weeks.\n * <p>\n * <h3>Week of Month</h3>\n * One field is used: week-of-month.\n * The calculation ensures that weeks never overlap a month boundary.\n * The month is divided into periods where each period starts on the defined first day-of-week.\n * The earliest period is referred to as week 0 if it has less than the minimal number of days\n * and week 1 if it has at least the minimal number of days.\n * <p>\n * <table cellpadding=\"0\" cellspacing=\"3\" border=\"0\" style=\"text-align: left; width: 50%;\">\n * <caption>Examples of WeekFields</caption>\n * <tr><th>Date</th><td>Day-of-week</td>\n * <td>First day: Monday<br>Minimal days: 4</td><td>First day: Monday<br>Minimal days: 5</td></tr>\n * <tr><th>2008-12-31</th><td>Wednesday</td>\n * <td>Week 5 of December 2008</td><td>Week 5 of December 2008</td></tr>\n * <tr><th>2009-01-01</th><td>Thursday</td>\n * <td>Week 1 of January 2009</td><td>Week 0 of January 2009</td></tr>\n * <tr><th>2009-01-04</th><td>Sunday</td>\n * <td>Week 1 of January 2009</td><td>Week 0 of January 2009</td></tr>\n * <tr><th>2009-01-05</th><td>Monday</td>\n * <td>Week 2 of January 2009</td><td>Week 1 of January 2009</td></tr>\n * </table>\n * <p>\n * <h3>Week of Year</h3>\n * One field is used: week-of-year.\n * The calculation ensures that weeks never overlap a year boundary.\n * The year is divided into periods where each period starts on the defined first day-of-week.\n * The earliest period is referred to as week 0 if it has less than the minimal number of days\n * and week 1 if it has at least the minimal number of days.\n * <p>\n * This class is immutable and thread-safe.\n */\nexport class WeekFields {\n // implementation notes\n // querying week-of-month or week-of-year should return the week value bound within the month/year\n // however, setting the week value should be lenient (use plus/minus weeks)\n // allow week-of-month outer range [0 to 5]\n // allow week-of-year outer range [0 to 53]\n // this is because callers shouldn't be expected to know the details of validity\n\n /**\n * function overloading for {@link WeekFields#of}\n *\n * if called with 1 arguments then {@link WeekFields.ofLocale} is executed.\n *\n * Otherwise {@link WeekFields.ofFirstDayOfWeekMinDays} is executed.\n *\n * @param {!DayOfWeek | Locale} firstDayOrLocale\n * @param {Number} minDays\n * @returns {WeekFields} this for chaining\n */\n static of(firstDayOrLocale, minDays) {\n if (minDays === undefined) {\n return WeekFields.ofLocale(firstDayOrLocale);\n } else {\n return WeekFields.ofFirstDayOfWeekMinDays(firstDayOrLocale, minDays);\n }\n }\n\n /**\n * Obtains an instance of {@code WeekFields} appropriate for a locale.\n * <p>\n * This will look up appropriate values from the provider of localization data.\n *\n * @param {!Locale} locale the locale to use, not null\n * @return the week-definition, not null\n */\n static ofLocale(locale) {\n requireNonNull(locale, 'locale');\n\n Cldr.load(cldrData('supplemental/weekData.json'));\n const cldr = new Cldr(locale.localeString());\n const worldRegion = '001';\n const weekData = cldr.get('supplemental/weekData');\n let dow = _weekDayMap[weekData.firstDay[locale.country()]];\n if (!dow) {\n dow = _weekDayMap[weekData.firstDay[worldRegion]];\n }\n let minDays = weekData.minDays[locale.country()];\n if (!minDays) {\n minDays = weekData.minDays[worldRegion];\n }\n return WeekFields.ofFirstDayOfWeekMinDays(dow, minDays);\n }\n\n /**\n * Obtains an instance of {@code WeekFields} from the first day-of-week and minimal days.\n * <p>\n * The first day-of-week defines the ISO {@code DayOfWeek} that is day 1 of the week.\n * The minimal number of days in the first week defines how many days must be present\n * in a month or year, starting from the first day-of-week, before the week is counted\n * as the first week. A value of 1 will count the first day of the month or year as part\n * of the first week, whereas a value of 7 will require the whole seven days to be in\n * the new month or year.\n * <p>\n * WeekFields instances are singletons; for each unique combination\n * of {@code firstDayOfWeek} and {@code minimalDaysInFirstWeek} the\n * the same instance will be returned.\n *\n * @param {!DayOfWeek} firstDayOfWeek the first day of the week, not null\n * @param {!Number} minimalDaysInFirstWeek the minimal number of days in the first week, from\n * 1 to 7\n * @return {WeekFields} the week-definition, not null\n * @throws IllegalArgumentException if the minimal days value is less than one\n * or greater than 7\n */\n static ofFirstDayOfWeekMinDays(firstDayOfWeek, minimalDaysInFirstWeek) {\n requireNonNull(firstDayOfWeek, 'firstDayOfWeek');\n requireInstance(firstDayOfWeek, DayOfWeek, 'firstDayOfWeek');\n requireNonNull(minimalDaysInFirstWeek, 'minimalDaysInFirstWeek');\n const key = firstDayOfWeek.toString() + minimalDaysInFirstWeek;\n let rules = WeekFieldsCache.get(key);\n if (rules == null) {\n rules = new WeekFields(firstDayOfWeek, minimalDaysInFirstWeek);\n WeekFieldsCache.set(key, rules);\n rules = WeekFieldsCache.get(key);\n }\n return rules;\n }\n\n //-----------------------------------------------------------------------\n /**\n * Creates an instance of the definition.\n *\n * @param {!DayOfWeek} firstDayOfWeek the first day of the week, not null\n * @param {!Number} minimalDaysInFirstWeek the minimal number of days in the first week, from\n * 1 to 7\n * @throws IllegalArgumentException if the minimal days value is invalid\n *\n * @private\n */\n constructor(firstDayOfWeek, minimalDaysInFirstWeek) {\n requireNonNull(firstDayOfWeek, 'firstDayOfWeek');\n requireInstance(firstDayOfWeek, DayOfWeek, 'firstDayOfWeek');\n requireNonNull(minimalDaysInFirstWeek, 'minimalDaysInFirstWeek');\n if (minimalDaysInFirstWeek < 1 || minimalDaysInFirstWeek > 7) {\n throw new IllegalArgumentException('Minimal number of days is invalid');\n }\n this._firstDayOfWeek = firstDayOfWeek;\n this._minimalDays = minimalDaysInFirstWeek;\n this._dayOfWeek = ComputedDayOfField.ofDayOfWeekField(this);\n this._weekOfMonth = ComputedDayOfField.ofWeekOfMonthField(this);\n this._weekOfYear = ComputedDayOfField.ofWeekOfYearField(this);\n this._weekOfWeekBasedYear = ComputedDayOfField.ofWeekOfWeekBasedYearField(this);\n this._weekBasedYear = ComputedDayOfField.ofWeekBasedYearField(this);\n Cldr.load(cldrData('supplemental/likelySubtags.json'));\n }\n\n //-----------------------------------------------------------------------\n /**\n * Gets the first day-of-week.\n * <p>\n * The first day-of-week varies by culture.\n * For example, the US uses Sunday, while France and the ISO-8601 standard use Monday.\n * This method returns the first day using the standard {@code DayOfWeek} enum.\n *\n * @return {DayOfWeek} the first day-of-week, not null\n */\n firstDayOfWeek() {\n return this._firstDayOfWeek;\n }\n\n /**\n * Gets the minimal number of days in the first week.\n * <p>\n * The number of days considered to define the first week of a month or year\n * varies by culture.\n * For example, the ISO-8601 requires 4 days (more than half a week) to\n * be present before counting the first week.\n *\n * @return {Number} the minimal number of days in the first week of a month or year, from 1 to 7\n */\n minimalDaysInFirstWeek() {\n return this._minimalDays;\n }\n\n //-----------------------------------------------------------------------\n /**\n * Returns a field to access the day of week based on this {@code WeekFields}.\n * <p>\n * This is similar to {@link ChronoField#DAY_OF_WEEK} but uses values for\n * the day-of-week based on this {@code WeekFields}.\n * The days are numbered from 1 to 7 where the\n * {@link #getFirstDayOfWeek() first day-of-week} is assigned the value 1.\n * <p>\n * For example, if the first day-of-week is Sunday, then that will have the\n * value 1, with other days ranging from Monday as 2 to Saturday as 7.\n * <p>\n * In the resolving phase of parsing, a localized day-of-week will be converted\n * to a standardized {@code ChronoField} day-of-week.\n * The day-of-week must be in the valid range 1 to 7.\n * Other fields in this class build dates using the standardized day-of-week.\n *\n * @return {TemporalField} a field providing access to the day-of-week with localized\n * numbering, not null\n */\n dayOfWeek() {\n return this._dayOfWeek;\n }\n\n /**\n * Returns a field to access the week of month based on this {@code WeekFields}.\n * <p>\n * This represents the concept of the count of weeks within the month where weeks\n * start on a fixed day-of-week, such as Monday.\n * This field is typically used with {@link WeekFields#dayOfWeek()}.\n * <p>\n * Week one (1) is the week starting on the {@link WeekFields#firstDayOfWeek}\n * where there are at least {@link WeekFields#getMinimalDaysInFirstWeek()} days in the month.\n * Thus, week one may start up to {@code minDays} days before the start of the month.\n * If the first week starts after the start of the month then the period before is week zero\n * (0).\n * <p>\n * For example:<br>\n * - if the 1st day of the month is a Monday, week one starts on the 1st and there is no week\n * zero<br>\n * - if the 2nd day of the month is a Monday, week one starts on the 2nd and the 1st is in week\n * zero<br>\n * - if the 4th day of the month is a Monday, week one starts on the 4th and the 1st to 3rd is\n * in week zero<br>\n * - if the 5th day of the month is a Monday, week two starts on the 5th and the 1st to 4th is\n * in week one<br>\n * <p>\n * This field can be used with any calendar system.\n * <p>\n * In the resolving phase of parsing, a date can be created from a year,\n * week-of-month, month-of-year and day-of-week.\n * <p>\n * In {@linkplain ResolverStyle#STRICT strict mode}, all four fields are\n * validated against their range of valid values. The week-of-month field\n * is validated to ensure that the resulting month is the month requested.\n * <p>\n * In {@linkplain ResolverStyle#SMART smart mode}, all four fields are\n * validated against their range of valid values. The week-of-month field\n * is validated from 0 to 6, meaning that the resulting date can be in a\n * different month to that specified.\n * <p>\n * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week\n * are validated against the range of valid values. The resulting date is calculated\n * equivalent to the following four stage approach.\n * First, create a date on the first day of the first week of January in the requested year.\n * Then take the month-of-year, subtract one, and add the amount in months to the date.\n * Then take the week-of-month, subtract one, and add the amount in weeks to the date.\n * Finally, adjust to the correct day-of-week within the localized week.\n *\n * @return {TemporalField} a field providing access to the week-of-month, not null\n */\n weekOfMonth() {\n return this._weekOfMonth;\n }\n\n /**\n * Returns a field to access the week of year based on this {@code WeekFields}.\n * <p>\n * This represents the concept of the count of weeks within the year where weeks\n * start on a fixed day-of-week, such as Monday.\n * This field is typically used with {@link WeekFields#dayOfWeek()}.\n * <p>\n * Week one(1) is the week starting on the {@link WeekFields#firstDayOfWeek}\n * where there are at least {@link WeekFields#getMinimalDaysInFirstWeek()} days in the year.\n * Thus, week one may start up to {@code minDays} days before the start of the year.\n * If the first week starts after the start of the year then the period before is week zero\n * (0).\n * <p>\n * For example:<br>\n * - if the 1st day of the year is a Monday, week one starts on the 1st and there is no week\n * zero<br>\n * - if the 2nd day of the year is a Monday, week one starts on the 2nd and the 1st is in week\n * zero<br>\n * - if the 4th day of the year is a Monday, week one starts on the 4th and the 1st to 3rd is\n * in week zero<br>\n * - if the 5th day of the year is a Monday, week two starts on the 5th and the 1st to 4th is\n * in week one<br>\n * <p>\n * This field can be used with any calendar system.\n * <p>\n * In the resolving phase of parsing, a date can be created from a year,\n * week-of-year and day-of-week.\n * <p>\n * In {@linkplain ResolverStyle#STRICT strict mode}, all three fields are\n * validated against their range of valid values. The week-of-year field\n * is validated to ensure that the resulting year is the year requested.\n * <p>\n * In {@linkplain ResolverStyle#SMART smart mode}, all three fields are\n * validated against their range of valid values. The week-of-year field\n * is validated from 0 to 54, meaning that the resulting date can be in a\n * different year to that specified.\n * <p>\n * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week\n * are validated against the range of valid values. The resulting date is calculated\n * equivalent to the following three stage approach.\n * First, create a date on the first day of the first week in the requested year.\n * Then take the week-of-year, subtract one, and add the amount in weeks to the date.\n * Finally, adjust to the correct day-of-week within the localized week.\n *\n * @return {TemporalField} a field providing access to the week-of-year, not null\n */\n weekOfYear() {\n return this._weekOfYear;\n }\n\n /**\n * Returns a field to access the week of a week-based-year based on this {@code WeekFields}.\n * <p>\n * This represents the concept of the count of weeks within the year where weeks\n * start on a fixed day-of-week, such as Monday and each week belongs to exactly one year.\n * This field is typically used with {@link WeekFields#dayOfWeek()} and\n * {@link WeekFields#weekBasedYear()}.\n * <p>\n * Week one(1) is the week starting on the {@link WeekFields#firstDayOfWeek}\n * where there are at least {@link WeekFields#getMinimalDaysInFirstWeek()} days in the year.\n * If the first week starts after the start of the year then the period before\n * is in the last week of the previous year.\n * <p>\n * For example:<br>\n * - if the 1st day of the year is a Monday, week one starts on the 1st<br>\n * - if the 2nd day of the year is a Monday, week one starts on the 2nd and\n * the 1st is in the last week of the previous year<br>\n * - if the 4th day of the year is a Monday, week one starts on the 4th and\n * the 1st to 3rd is in the last week of the previous year<br>\n * - if the 5th day of the year is a Monday, week two starts on the 5th and\n * the 1st to 4th is in week one<br>\n * <p>\n * This field can be used with any calendar system.\n * <p>\n * In the resolving phase of parsing, a date can be created from a week-based-year,\n * week-of-year and day-of-week.\n * <p>\n * In {@linkplain ResolverStyle#STRICT strict mode}, all three fields are\n * validated against their range of valid values. The week-of-year field\n * is validated to ensure that the resulting week-based-year is the\n * week-based-year requested.\n * <p>\n * In {@linkplain ResolverStyle#SMART smart mode}, all three fields are\n * validated against their range of valid values. The week-of-week-based-year field\n * is validated from 1 to 53, meaning that the resulting date can be in the\n * following week-based-year to that specified.\n * <p>\n * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week\n * are validated against the range of valid values. The resulting date is calculated\n * equivalent to the following three stage approach.\n * First, create a date on the first day of the first week in the requested week-based-year.\n * Then take the week-of-week-based-year, subtract one, and add the amount in weeks to the date.\n * Finally, adjust to the correct day-of-week within the localized week.\n *\n * @return {TemporalField} a field providing access to the week-of-week-based-year, not null\n */\n weekOfWeekBasedYear() {\n return this._weekOfWeekBasedYear;\n }\n\n /**\n * Returns a field to access the year of a week-based-year based on this {@code WeekFields}.\n * <p>\n * This represents the concept of the year where weeks start on a fixed day-of-week,\n * such as Monday and each week belongs to exactly one year.\n * This field is typically used with {@link WeekFields#dayOfWeek()} and\n * {@link WeekFields#weekOfWeekBasedYear()}.\n * <p>\n * Week one(1) is the week starting on the {@link WeekFields#firstDayOfWeek}\n * where there are at least {@link WeekFields#getMinimalDaysInFirstWeek()} days in the year.\n * Thus, week one may start before the start of the year.\n * If the first week starts after the start of the year then the period before\n * is in the last week of the previous year.\n * <p>\n * This field can be used with any calendar system.\n * <p>\n * In the resolving phase of parsing, a date can be created from a week-based-year,\n * week-of-year and day-of-week.\n * <p>\n * In {@linkplain ResolverStyle#STRICT strict mode}, all three fields are\n * validated against their range of valid values. The week-of-year field\n * is validated to ensure that the resulting week-based-year is the\n * week-based-year requested.\n * <p>\n * In {@linkplain ResolverStyle#SMART smart mode}, all three fields are\n * validated against their range of valid values. The week-of-week-based-year field\n * is validated from 1 to 53, meaning that the resulting date can be in the\n * following week-based-year to that specified.\n * <p>\n * In {@linkplain ResolverStyle#LENIENT lenient mode}, the year and day-of-week\n * are validated against the range of valid values. The resulting date is calculated\n * equivalent to the following three stage approach.\n * First, create a date on the first day of the first week in the requested week-based-year.\n * Then take the week-of-week-based-year, subtract one, and add the amount in weeks to the date.\n * Finally, adjust to the correct day-of-week within the localized week.\n *\n * @return {TemporalField} a field providing access to the week-based-year, not null\n */\n weekBasedYear() {\n return this._weekBasedYear;\n }\n\n //-----------------------------------------------------------------------\n /**\n * Checks if this {@code WeekFields} is equal to the specified other.\n * <p>\n * The comparison is based on the entire state of the rules, which is\n * the first day-of-week and minimal days.\n *\n * @param {*} other the other rules to compare to, null returns false\n * @return true if this is equal to the specified rules\n */\n equals(other) {\n if (this === other) {\n return true;\n }\n if (other instanceof WeekFields) {\n return this.hashCode() === other.hashCode();\n }\n return false;\n }\n\n /**\n * A hash code for this {@code WeekFields}.\n *\n * @return a suitable hash code\n */\n hashCode() {\n return this._firstDayOfWeek.ordinal() * 7 + this._minimalDays;\n }\n\n //-----------------------------------------------------------------------\n /**\n * A string representation of this {@code WeekFields} instance.\n *\n * @return the string representation, not null\n */\n toString() {\n return `WeekFields[${this._firstDayOfWeek},${this._minimalDays}]`;\n }\n\n}\n\nexport function _init() {\n /**\n * The ISO-8601 definition, where a week starts on Monday and the first week\n * has a minimum of 4 days.\n * <p>\n * The ISO-8601 standard defines a calendar system based on weeks.\n * It uses the week-based-year and week-of-week-based-year concepts to split\n * up the passage of days instead of the standard year/month/day.\n * <p>\n * Note that the first week may start in the previous calendar year.\n * Note also that the first few days of a calendar year may be in the\n * week-based-year corresponding to the previous calendar year.\n */\n WeekFields.ISO = WeekFields.of(DayOfWeek.MONDAY, 4);\n\n /**\n * The common definition of a week that starts on Sunday.\n * <p>\n * Defined as starting on Sunday and with a minimum of 1 day in the month.\n * This week definition is in use in the US and other European countries.\n *\n */\n WeekFields.SUNDAY_START = WeekFields.of(DayOfWeek.SUNDAY, 1);\n\n}\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\nimport { _ as jodaInternal, DateTimeFormatterBuilder, SignStyle } from '@js-joda/core';\n\nimport { WeekFields } from '../../temporal/WeekFields';\n\nconst { StringBuilder } = jodaInternal;\n\nexport default class WeekFieldsPrinterParser {\n constructor(letter, count) {\n this._letter = letter;\n this._count = count;\n }\n\n print(context, buf) {\n const weekFields = WeekFields.of(context.locale());\n const pp = this._evaluate(weekFields);\n return pp.print(context, buf);\n }\n\n parse(context, text, position) {\n const weekFields = WeekFields.of(context.locale());\n const pp = this._evaluate(weekFields);\n return pp.parse(context, text, position);\n }\n\n _evaluate(weekFields) {\n let pp = null;\n switch (this._letter) {\n case 'e': // day-of-week\n pp = new DateTimeFormatterBuilder.NumberPrinterParser(weekFields.dayOfWeek(), this._count, 2, SignStyle.NOT_NEGATIVE);\n break;\n case 'c': // day-of-week\n pp = new DateTimeFormatterBuilder.NumberPrinterParser(weekFields.dayOfWeek(), this._count, 2, SignStyle.NOT_NEGATIVE);\n break;\n case 'w': // week-of-year\n pp = new DateTimeFormatterBuilder.NumberPrinterParser(weekFields.weekOfWeekBasedYear(), this._count, 2, SignStyle.NOT_NEGATIVE);\n break;\n case 'W': // week-of-month\n pp = new DateTimeFormatterBuilder.NumberPrinterParser(weekFields.weekOfMonth(), 1, 2, SignStyle.NOT_NEGATIVE);\n break;\n case 'Y': // weekyear\n if (this._count === 2) {\n pp = new DateTimeFormatterBuilder.ReducedPrinterParser(weekFields.weekBasedYear(), 2, 2, 0, DateTimeFormatterBuilder.ReducedPrinterParser.BASE_DATE);\n } else {\n pp = new DateTimeFormatterBuilder.NumberPrinterParser(weekFields.weekBasedYear(), this._count, 19,\n (this._count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1);\n }\n break;\n }\n return pp;\n }\n\n toString() {\n const sb = new StringBuilder(30);\n sb.append('Localized(');\n if (this._letter === 'Y') {\n if (this._count === 1) {\n sb.append('WeekBasedYear');\n } else if (this._count === 2) {\n sb.append('ReducedValue(WeekBasedYear,2,2,2000-01-01)');\n } else {\n sb.append('WeekBasedYear,').append(this._count).append(',')\n .append(19).append(',')\n .append((this._count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD);\n }\n } else {\n if (this._letter === 'c' || this._letter === 'e') {\n sb.append('DayOfWeek');\n } else if (this._letter === 'w') {\n sb.append('WeekOfWeekBasedYear');\n } else if (this._letter === 'W') {\n sb.append('WeekOfMonth');\n }\n sb.append(',');\n sb.append(this._count);\n }\n sb.append(')');\n return sb.toString();\n }\n}\n","/**\n * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper\n * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos\n * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)\n */\n\nimport {\n _ as jodaInternal,\n DateTimeFormatterBuilder,\n IllegalArgumentException,\n TextStyle,\n ChronoField,\n TemporalField\n} from '@js-joda/core';\n\nimport TextPrinterParser from '../parser/TextPrinterParser';\nimport CldrDateTimeTextProvider from './CldrDateTimeTextProvider';\nimport CldrZoneTextPrinterParser from './CldrZoneTextPrinterParser';\nimport { LocaleStore } from '../LocaleStore';\nimport LocalizedOffsetPrinterParser from '../parser/LocalizedOffsetPrinterParser';\nimport WeekFieldsPrinterParser from '../parser/WeekFieldsPrinterParser';\n\nconst { assert: { requireNonNull, requireInstance } } = jodaInternal;\n\n/** DateTimeFormatterBuilder extension functions implementing locale handling using cldr data (http://cldr.unicode.org/)\n */\nexport default class CldrDateTimeFormatterBuilder extends DateTimeFormatterBuilder {\n\n //-------------------------------------------------------------------------\n /**\n * function overloading for {@link CldrDateTimeFormatterBuilder#appendText}\n *\n * if called with 1 arguments and first argument is an instance of ChronoField,\n * then {@link CldrDateTimeFormatterBuilder.appendTextField} is executed.\n * if called with 2 arguments and second argument is an instance of TextStyle,\n * then {@link CldrDateTimeFormatterBuilder.appendTextFieldStyle} is executed.\n *\n * Otherwise {@link CldrDateTimeFormatterBuilder.appendTextFieldMap} is executed.\n *\n * @param {!ChronoField} field\n * @param {!(TextStyle|Object)} styleOrMap\n * @returns {DateTimeFormatterBuilder} this for chaining\n */\n appendText(field, styleOrMap) {\n if (styleOrMap === undefined) {\n return this.appendTextField(field);\n } else if (styleOrMap instanceof TextStyle) {\n return this.appendTextFieldStyle(field, styleOrMap);\n } else {\n return this.appendTextFieldMap(field, styleOrMap);\n }\n }\n\n /**\n * Appends the text of a date-time field to the formatter using the full\n * text style.\n * <p>\n * The text of the field will be output during a print.\n * The value must be within the valid range of the field.\n * If the value cannot be obtained then an exception will be thrown.\n * If the field has no textual representation, then the numeric value will be used.\n * <p>\n * The value will be printed as per the normal print of an integer value.\n * Only negative numbers will be signed. No padding will be added.\n *\n * @param {!TemporalField} field the field to append, not null\n * @return {DateTimeFormatterBuilder} this, for chaining, not null\n */\n appendTextField(field) {\n return this.appendTextFieldStyle(field, TextStyle.FULL);\n }\n\n /**\n * Appends the text of a date-time field to the formatter.\n * <p>\n * The text of the field will be output during a print.\n * The value must be within the valid range of the field.\n * If the value cannot be obtained then an exception will be thrown.\n * If the field has no textual representation, then the numeric value will be used.\n * <p>\n * The value will be printed as per the normal print of an integer value.\n * Only negative numbers will be signed. No padding will be added.\n *\n * @param {!TemporalField} field the field to append, not null\n * @param {!TextStyle} textStyle the text style to use, not null\n * @return {DateTimeFormatterBuilder} this, for chaining, not null\n */\n appendTextFieldStyle(field, textStyle) {\n requireNonNull(field, 'field');\n requireInstance(field, TemporalField, 'field');\n requireNonNull(textStyle, 'textStyle');\n requireInstance(textStyle, TextStyle, 'textStyle');\n this._appendInternal(new TextPrinterParser(field, textStyle, new CldrDateTimeTextProvider()));\n return this;\n }\n\n /**\n * Appends the text of a date-time field to the formatter using the specified\n * map to supply the text.\n * <p>\n * The standard text outputting methods use the localized text in the JDK.\n * This method allows that text to be specified directly.\n * The supplied map is not validated by the builder to ensure that printing or\n * parsing is possible, thus an invalid map may throw an error during later use.\n * <p>\n * Supplying the map of text provides considerable flexibility in printing and parsing.\n * For example, a legacy application might require or supply the months of the\n * year as \"JNY\", \"FBY\", \"MCH\" etc. These do not match the standard set of text\n * for localized month names. Using this method, a map can be created which\n * defines the connection between each value and the text:\n * <pre>\n * Map<Long, String> map = new HashMap<>();\n * map.put(1, \"JNY\");\n * map.put(2, \"FBY\");\n * map.put(3, \"MCH\");\n * ...\n * builder.appendText(MONTH_OF_YEAR, map);\n * </pre>\n * <p>\n * Other uses might be to output the value with a suffix, such as \"1st\", \"2nd\", \"3rd\",\n * or as Roman numerals \"I\", \"II\", \"III\", \"IV\".\n * <p>\n * During printing, the value is obtained and checked that it is in the valid range.\n * If text is not available for the value then it is output as a number.\n * During parsing, the parser will match against the map of text and numeric values.\n *\n * @param {!ChronoField} field the field to append, not null\n * @param {!Object} textLookup the map from the value to the text\n * @return {DateTimeFormatterBuilder} this, for chaining, not null\n */\n appendTextFieldMap(field, textLookup) {\n requireNonNull(field, 'field');\n requireInstance(field, ChronoField, 'field');\n requireNonNull(textLookup, 'textLookup');\n const copy = { ...textLookup };\n const map = {};\n map[TextStyle.FULL] = copy;\n const store = new LocaleStore(map);\n const provider = {\n getText: function(field, value, style) {\n return store.getText(value, style);\n },\n getTextIterator: function(field, style) {\n return store.getTextIterator(style);\n }\n };\n this._appendInternal(new TextPrinterParser(field, TextStyle.FULL, provider));\n return this;\n }\n\n appendWeekField(field, count) {\n requireNonNull(field, 'field');\n requireNonNull(count, 'count');\n this._appendInternal(new WeekFieldsPrinterParser(field, count));\n return this;\n }\n\n /**\n * Appends the time-zone name, such as 'British Summer Time', to the formatter.\n * <p>\n * This appends an instruction to print the textual name of the zone to the builder.\n * <p>\n * During printing, the zone is obtained using a mechanism equivalent\n * to querying the temporal with {@link TemporalQueries#zoneId()}.\n * If the zone is a {@code ZoneOffset} it will be printed using the\n * result of {@link ZoneOffset#getId()}.\n * If the zone is not an offset, the textual name will be looked up\n * for the locale set in the {@link DateTimeFormatter}.\n * If the temporal object being printed represents an instant, then the text\n * will be the summer or winter time text as appropriate.\n * If the lookup for text does not find any suitable reuslt, then the\n * {@link ZoneId#getId() ID} will be printed instead.\n * If the zone cannot be obtained then an exception is thrown unless the\n * section of the formatter is optional.\n * <p>\n * Parsing is not currently supported.\n *\n * @param {!TextStyle} textStyle the text style to use, not null\n * @return this, for chaining, not null\n */\n appendZoneText(textStyle) {\n this._appendInternal(new CldrZoneTextPrinterParser(textStyle));\n return this;\n }\n\n /**\n * Appends the localized zone offset, such as 'GMT+01:00', to the formatter.\n * <p>\n * This appends a localized zone offset to the builder, the format of the\n * localized offset is controlled by the specified {@link FormatStyle style}\n * to this method:\n * <ul>\n * <li>{@link TextStyle#FULL full} - formats with localized offset text, such\n * as 'GMT, 2-digit hour and minute field, optional second field if non-zero,\n * and colon.\n * <li>{@link TextStyle#SHORT short} - formats with localized offset text,\n * such as 'GMT, hour without leading zero, optional 2-digit minute and\n * second if non-zero, and colon.\n * </ul>\n * <p>\n * During formatting, the offset is obtained using a mechanism equivalent\n * to querying the temporal with {@link TemporalQueries#offset()}.\n * If the offset cannot be obtained then an exception is thrown unless the\n * section of the formatter is optional.\n * <p>\n * During parsing, the offset is parsed using the format defined above.\n * If the offset cannot be parsed then an exception is thrown unless the\n * section of the formatter is optional.\n * <p>\n * @param {TextStyle} textStyle the format style to use, not null\n * @return this, for chaining, not null\n * @throws IllegalArgumentException if style is neither {@link TextStyle#FULL\n * full} nor {@link TextStyle#SHORT short}\n */\n appendLocalizedOffset(textStyle) {\n requireNonNull(textStyle, 'textStyle');\n if (textStyle !== TextStyle.FULL && textStyle !== TextStyle.SHORT) {\n throw new IllegalArgumentException('Style must be either full or short');\n }\n this._appendInternal(new LocalizedOffsetPrinterParser(textStyle));\n return this;\n }\n\n //-----------------------------------------------------------------------\n\n}\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\nimport CldrDateTimeTextProvider from './format/cldr/CldrDateTimeTextProvider';\n\nexport default class Locale {\n static getAvailableLocales() {\n return new CldrDateTimeTextProvider().getAvailableLocales();\n }\n\n // TODO: maybe use new Cldr(<'en'>) constructor instead?\n // see https://github.com/rxaviers/cldrjs#instantiate-a-locale-and-get-it-normalized\n constructor(language, country = '', localeString = '') {\n this._language = language;\n this._country = country;\n this._localeString = localeString;\n }\n\n language() {\n return this._language;\n }\n\n country() {\n return this._country;\n }\n\n localeString() {\n if (this._localeString.length > 0) {\n return this._localeString;\n }\n if (this._country.length > 0) {\n return `${this._language}-${this._country}`;\n } else {\n return this._language;\n }\n }\n\n toString() {\n return `Locale[${this.localeString()}]`;\n }\n\n equals(other) {\n if (!other) {\n return false;\n }\n if (!(other instanceof Locale)) {\n return false;\n }\n return this.localeString() === other.localeString();\n }\n}\n\nexport function _init() {\n //some samples/consts\n Locale.ENGLISH = new Locale('en');\n Locale.US = new Locale('en', 'US', 'en'); // default in cldr-data, no en-US\n Locale.UK = new Locale('en', 'GB');\n Locale.CANADA = new Locale('en', 'CA');\n Locale.FRENCH = new Locale('fr');\n Locale.FRANCE = new Locale('fr', 'FR', 'fr'); // default in cldr-data, no fr-FR\n Locale.GERMAN = new Locale('de');\n Locale.GERMANY = new Locale('de', 'DE', 'de'); // default in cldr-data, no de-DE\n Locale.KOREAN = new Locale('ko');\n Locale.JAPANESE = new Locale('ja', 'JP');\n Locale.JAPAN = new Locale('ja', 'JP', 'ja');\n Locale.ITALIAN = new Locale('it');\n Locale.ITALY = new Locale('it', 'IT', 'it');\n Locale.CHINESE = new Locale('zh');\n Locale.ROMANIAN = new Locale('ro');\n Locale.SWEDISH = new Locale('sv');\n Locale.SWEDEN = new Locale('sv', 'SE', 'sv');\n Locale.HINDI = new Locale('hi');\n Locale.RUSSIAN = new Locale('ru');\n}\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\nimport {\n _ as jodaInternal,\n DateTimeFormatter,\n ChronoField,\n ResolverStyle,\n IsoChronology,\n} from '@js-joda/core';\n// eslint-disable-next-line no-unused-vars\nimport Locale from '../Locale';\nimport CldrDateTimeFormatterBuilder from './cldr/CldrDateTimeFormatterBuilder';\n\nconst { assert: { requireNonNull } } = jodaInternal;\n\nexport default class LocaleDateTimeFormatter extends DateTimeFormatter {\n\n /**\n * Returns a copy of this formatter with a new locale.\n * <p>\n * This is used to lookup any part of the formatter needing specific\n * localization, such as the text or localized pattern.\n * <p>\n * This instance is immutable and unaffected by this method call.\n *\n * @param {!Locale} locale the new locale, not null\n * @return a formatter based on this formatter with the requested locale, not null\n */\n withLocale(locale) {\n requireNonNull(locale, 'locale');\n if (locale.equals(this._locale)) {\n return this;\n }\n return new DateTimeFormatter(this._printerParser, locale, this._decimalStyle, this._resolverStyle, this._resolverFields, this._chrono, this._zone);\n }\n}\n\nexport function _init() {\n const dow = {\n 1: 'Mon',\n 2: 'Tue',\n 3: 'Wed',\n 4: 'Thu',\n 5: 'Fri',\n 6: 'Sat',\n 7: 'Sun',\n };\n\n const moy = {\n 1: 'Jan',\n 2: 'Feb',\n 3: 'Mar',\n 4: 'Apr',\n 5: 'May',\n 6: 'Jun',\n 7: 'Jul',\n 8: 'Aug',\n 9: 'Sep',\n 10: 'Oct',\n 11: 'Nov',\n 12: 'Dec',\n };\n\n LocaleDateTimeFormatter.RFC_1123_DATE_TIME = new CldrDateTimeFormatterBuilder()\n .parseCaseInsensitive()\n .parseLenient()\n .optionalStart()\n .appendText(ChronoField.DAY_OF_WEEK, dow)\n .appendLiteral(', ')\n .optionalEnd()\n .appendValue(ChronoField.DAY_OF_MONTH, 2)\n .appendLiteral(' ')\n .appendText(ChronoField.MONTH_OF_YEAR, moy)\n .appendLiteral(' ')\n .appendValue(ChronoField.YEAR, 4) // 2 digit year not handled\n .appendLiteral(' ')\n .appendValue(ChronoField.HOUR_OF_DAY, 2)\n .appendLiteral(':')\n .appendValue(ChronoField.MINUTE_OF_HOUR, 2)\n .optionalStart()\n .appendLiteral(':')\n .appendValue(ChronoField.SECOND_OF_MINUTE, 2)\n .optionalEnd()\n .appendLiteral(' ')\n .appendZoneId()\n .toFormatter(ResolverStyle.SMART).withChronology(IsoChronology.INSTANCE);\n}\n","/*\n * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper\n * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)\n */\n\nimport { _init as localeInit } from './Locale';\nimport { _init as weekFieldsInit } from './temporal/WeekFields';\nimport { _init as dateTimeFormatterInit } from './format/LocaleDateTimeFormatter';\n\nlet isInit = false;\n\nfunction init() {\n /* istanbul ignore if */\n if (isInit) {\n return;\n }\n\n isInit = true;\n\n localeInit();\n weekFieldsInit();\n dateTimeFormatterInit();\n}\n\ninit();\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\n\n/* eslint-disable no-param-reassign */\n\nimport CldrDateTimeFormatterBuilder from './format/cldr/CldrDateTimeFormatterBuilder';\nimport LocaleDateTimeFormatter from './format/LocaleDateTimeFormatter';\n\nimport './_init';\n\n/**\n * @private\n *\n * plugin Function, call using js-jodas use()\n *\n * @param jsJoda\n */\nexport default function (jsJoda) {\n // inject all prototype properties (except constructor) from CldrDateTimeFormatterBuilder into DateTimeFormatterBuilder\n Object.getOwnPropertyNames(CldrDateTimeFormatterBuilder.prototype).forEach((prop) => {\n if (prop !== 'constructor') {\n jsJoda.DateTimeFormatterBuilder.prototype[prop] = CldrDateTimeFormatterBuilder.prototype[prop];\n }\n });\n // inject all prototype properties (except constructor) from LocaleDateTimeFormatter into DateTimeFormatter\n Object.getOwnPropertyNames(LocaleDateTimeFormatter.prototype).forEach((prop) => {\n if (prop !== 'constructor') {\n jsJoda.DateTimeFormatter.prototype[prop] = LocaleDateTimeFormatter.prototype[prop];\n }\n });\n // copy statics manually\n jsJoda.DateTimeFormatter.RFC_1123_DATE_TIME = LocaleDateTimeFormatter.RFC_1123_DATE_TIME;\n}\n","/*\n * @copyright (c) 2017, Philipp Thuerwaechter & Pattrick Hueper\n * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)\n */\nimport { use } from '@js-joda/core';\nimport plug from './plug';\nimport Locale from './Locale';\nimport { WeekFields } from './temporal/WeekFields';\n\nuse(plug);\n\nexport {\n Locale,\n WeekFields\n};\n"],"names":["TextPrinterParser","field","textStyle","provider","_field","_textStyle","_provider","_proto","prototype","print","context","buf","value","getValue","text","getText","locale","_numberPrinterParser","append","parse","parseText","position","length","IllegalArgumentException","style","isStrict","it","getTextIterator","_iterator","_createForOfIteratorHelperLoose","_step","done","entry","itText","key","subSequenceEquals","setParsedField","_currentNumberPrinterParser","DateTimeFormatterBuilder","NumberPrinterParser","SignStyle","NORMAL","toString","TextStyle","FULL","createEntry","_comparator","obj1","obj2","LocaleStore","valueTextMap","_valueTextMap","map","allList","Object","keys","forEach","reverse","list","undefined","parseInt","push","sort","concat","_parsable","Symbol","iterator","root","factory","module","this","arrayIsArray","Array","isArray","obj","call","pathNormalize","path","attributes","join","Error","replace","name","split","arraySome","array","callback","i","some","coreLikelySubtags","Cldr","cldr","subtags","options","match","matchFound","language","script","sep","localeSep","territory","variants","slice","get","test","force","coreRemoveLikelySubtags","maxLanguageId","result","coreSubtags","aux","unicodeLanguageId","arrayForEach","bundleLookup","minLanguageId","availableBundleMap","_availableBundleMap","availableBundleMapQueue","_availableBundleMapQueue","bundle","existing","maxBundle","minBundle","splice","objectKeys","object","createError","code","error","message","JSON","stringify","attribute","validate","check","validatePresence","validateType","expected","validateTypePath","isPlainObject","validateTypePlainObject","validateTypeString","resourceGet","data","node","coreSetAvailableBundles","json","main","hasOwnProperty","indexOf","alwaysArray","somethingOrArray","jsonMerge","merge","destination","sources","arguments","source","prop","coreLoad","jsons","j","itemGetResolved","normalizedPath","_resolved","init","_alwaysArray","_coreLoad","_createError","_itemGetResolved","_jsonMerge","_pathNormalize","_resourceGet","_validatePresence","_validateType","_validateTypePath","_validateTypePlainObject","load","unicodeLocaleExtensions","variant","unicodeLocaleExtensionsRaw","pop","region","type","require","EventEmitter","proto","indexOfListener","listeners","listener","alias","aliasClosure","apply","getListeners","evt","events","_getEvents","response","RegExp","flattenListeners","flatListeners","getListenersAsObject","addListener","listenerIsWrapped","once","on","addOnceListener","defineEvent","defineEvents","evts","removeListener","index","off","addListeners","manipulateListeners","removeListeners","remove","single","multiple","removeEvent","_events","removeAllListeners","emitEvent","args","_getOnceReturnValue","trigger","emit","setOnceReturnValue","_onceReturnValue","noConflict","originalGlobalValue","validateTypeFunction","superGet","superInit","globalEe","validateTypeEvent","validateThenCall","method","self","event","ee","getOverload","_eventInit","supplementalMain","prepend","supplemental","weekData","firstDay","minDays","timeData","allowed","preferred","initSuper","bundleParentLookup","parent","_raw","substr","lastIndexOf","resourceSet","itemLookup","lookup","childLocale","cldrDataLoaded","Set","loadCldrData","has","cldrData","add","localeToCldrInstanceCache","getOrCreateCldrInstance","localeToMapZonesCache","getOrCreateMapZones","mapZones","metaZone","mapZone","_other","_territory","_type","CldrDateTimeTextProvider","_cache","getAvailableLocales","availableLocales","store","_findStore","_createStore","localeString","ChronoField","MONTH_OF_YEAR","monthsData","styleMap","wide","narrow","NARROW","abbreviated","SHORT","_createLocaleStore","DAY_OF_WEEK","daysData","mon","tue","wed","thu","fri","sat","sun","AMPM_OF_DAY","dayPeriodsData","am","pm","ERA","erasData","eraNames","eraNarrow","eraAbbr","IsoFields","QUARTER_OF_YEAR","quartersData","FULL_STANDALONE","SHORT_STANDALONE","NARROW_STANDALONE","_jodaInternal$assert","jodaInternal","assert","requireNonNull","requireInstance","LENGTH_COMPARATOR","str1","str2","cmp","localeCompare","resolveZoneIdTextCache","CldrZoneTextPrinterParser","_zoneIdsLocales","_cachedResolveZoneIdText","zoneId","zoneIdToStyle","styleToType","typeToResolvedZoneIdText","_resolveZoneIdText","zoneData","metazoneInfo","metazone","metaZoneData","preferredZone","goldenZone","zone","getValueQuery","TemporalQueries","normalized","ZoneOffset","id","tzType","tzstyle","asNormal","_resolveZoneIds","localString","ids","ZoneRulesProvider","getAvailableZoneIds","genericText","standardText","daylightText","sortedKeys","_i","_arr","setParsedZone","ZoneId","of","_this$_resolveZoneIds","_iterator2","_step2","MathUtil","LocalizedOffsetPrinterParser","offsetSecs","OFFSET_SECONDS","OffsetIdPrinterParser","totalSecs","safeToInt","absHours","Math","abs","intMod","intDiv","absMinutes","absSeconds","end","sign","charAt","negative","ch","hour","offset","min","sec","DAY_OF_WEEK_RANGE","ValueRange","WEEK_OF_MONTH_RANGE","WEEK_OF_YEAR_RANGE","WEEK_OF_WEEK_BASED_YEAR_RANGE","WEEK_BASED_YEAR_RANGE","YEAR","range","_weekDayMap","DayOfWeek","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY","ComputedDayOfField","ofDayOfWeekField","weekDef","ChronoUnit","DAYS","WEEKS","ofWeekOfMonthField","MONTHS","ofWeekOfYearField","YEARS","ofWeekOfWeekBasedYearField","WEEK_BASED_YEARS","ofWeekBasedYearField","FOREVER","baseUnit","rangeUnit","_name","_weekDef","_baseUnit","_rangeUnit","_range","getFrom","temporal","sow","firstDayOfWeek","dow","_localizedDayOfWeek","_localizedWeekOfMonth","_localizedWeekOfYear","_localizedWOWBY","_localizedWBY","IllegalStateException","isoDow","floorMod","dom","DAY_OF_MONTH","_startOfWeekOffset","_computeWeek","doy","DAY_OF_YEAR","woy","previous","LocalDate","from","minus","year","yearLen","Year","isLeap","weekIndexOfFirstWeekNextYear","minimalDaysInFirstWeek","day","weekStart","adjustInto","newValue","newVal","checkValidIntValue","currentVal","baseWowby","weekOfWeekBasedYear","diffWeeks","roundDown","plus","newWowby","delta","resolve","fieldValues","partialTemporal","resolverStyle","localDow","put","containsKey","wby","date","days","ResolverStyle","LENIENT","wowby","dateDow","weeks","STRICT","getLong","DateTimeException","month","wom","isDateBased","isTimeBased","isSupportedBy","isSupported","EPOCH_DAY","rangeRefinedBy","_rangeWOWBY","fieldRange","minimum","maximum","IsoChronology","INSTANCE","displayName","WeekFieldsCache","Map","WeekFields","firstDayOrLocale","ofLocale","ofFirstDayOfWeekMinDays","worldRegion","country","rules","set","_firstDayOfWeek","_minimalDays","_dayOfWeek","_weekOfMonth","_weekOfYear","_weekOfWeekBasedYear","_weekBasedYear","_proto2","dayOfWeek","weekOfMonth","weekOfYear","weekBasedYear","equals","other","hashCode","ordinal","_init","ISO","SUNDAY_START","StringBuilder","WeekFieldsPrinterParser","letter","count","_letter","_count","weekFields","pp","_evaluate","NOT_NEGATIVE","ReducedPrinterParser","BASE_DATE","EXCEEDS_PAD","sb","CldrDateTimeFormatterBuilder","_DateTimeFormatterBui","_inheritsLoose","appendText","styleOrMap","appendTextField","appendTextFieldStyle","appendTextFieldMap","TemporalField","_appendInternal","textLookup","copy","_extends","appendWeekField","appendZoneText","appendLocalizedOffset","Locale","_language","_country","_localeString","ENGLISH","US","UK","CANADA","FRENCH","FRANCE","GERMAN","GERMANY","KOREAN","JAPANESE","JAPAN","ITALIAN","ITALY","CHINESE","ROMANIAN","SWEDISH","SWEDEN","HINDI","RUSSIAN","LocaleDateTimeFormatter","_DateTimeFormatter","withLocale","_locale","DateTimeFormatter","_printerParser","_decimalStyle","_resolverStyle","_resolverFields","_chrono","_zone","moy","RFC_1123_DATE_TIME","parseCaseInsensitive","parseLenient","optionalStart","appendLiteral","optionalEnd","appendValue","HOUR_OF_DAY","MINUTE_OF_HOUR","SECOND_OF_MINUTE","appendZoneId","toFormatter","SMART","withChronology","isInit","localeInit","weekFieldsInit","dateTimeFormatterInit","jsJoda","getOwnPropertyNames","use","plug"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[2,3,4,5,6]}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|