gpt-tokenizer
Version:
A pure JavaScript implementation of a BPE tokenizer (Encoder/Decoder) for GPT-2 / GPT-3 / GPT-4 and other OpenAI models
1 lines • 511 kB
JavaScript
!function(e,i){"object"==typeof exports&&"object"==typeof module?module.exports=i():"function"==typeof define&&define.amd?define("GPTTokenizer_r50k_base",[],i):"object"==typeof exports?exports.GPTTokenizer_r50k_base=i():e.GPTTokenizer_r50k_base=i()}(globalThis,(()=>(()=>{"use strict";var e={626:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.BytePairEncodingCore=i.decoder=void 0;const n=a(242),r=a(995),t=a(462),s=new Uint8Array(0);i.decoder=new TextDecoder("utf8"),i.BytePairEncodingCore=class{mergeableBytePairRankCount;bytePairRankDecoder;bytePairNonUtfRankDecoder=new Map;bytePairNonUtfSortedEncoder;bytePairStringRankEncoder;tokenSplitRegex;specialTokensEncoder;specialTokensDecoder;specialTokenPatternRegex;textEncoder=new TextEncoder;mergeCache;mergeCacheSize;constructor({bytePairRankDecoder:e,specialTokensEncoder:i,tokenSplitRegex:a,mergeCacheSize:s=n.DEFAULT_MERGE_CACHE_SIZE}){this.bytePairRankDecoder=e,this.bytePairStringRankEncoder=new Map,this.mergeCacheSize=s,s>0&&(this.mergeCache=new Map),this.mergeableBytePairRankCount=Object.keys(e).length;const o=[];e.forEach(((e,i)=>{if("string"==typeof e)return void this.bytePairStringRankEncoder.set(e,i);const a=new Uint8Array(e);o.push([a,i]),this.bytePairNonUtfRankDecoder.set(i,a)})),this.bytePairNonUtfSortedEncoder=o.sort(((e,i)=>(0,r.compareUint8Arrays)(e[0],i[0]))),this.specialTokensEncoder=i??new Map,this.specialTokensDecoder=i?new Map([...i].map((([e,i])=>[i,e]))):new Map,this.tokenSplitRegex=a;const l=[...this.specialTokensEncoder.keys()].map(t.escapeRegExp).join("|");try{this.specialTokenPatternRegex=new RegExp(l,"y")}catch{throw new Error("Invalid regular expression pattern.")}}setMergeCacheSize(e){0===this.mergeCacheSize&&e>0&&(this.mergeCache=new Map),this.mergeCacheSize=e,0===e&&(this.mergeCache=void 0)}clearMergeCache(){this.mergeCache?.clear()}*encodeNativeGenerator(e,i){let a=0,n=0;for(;;){const r=this.findNextSpecialToken(e,i,a),t=r?.[0],s=t??e.length,o=0===a&&s===e.length?e:e.slice(a,s);for(const[e]of o.matchAll(this.tokenSplitRegex)){const i=this.getBpeRankFromString(e);if(void 0!==i){n=1,yield[i];continue}const a=this.bytePairEncode(e);n=a.length,yield a}if(void 0===t)break;{const e=r[1],i=this.specialTokensEncoder.get(e);if(void 0===i)throw new Error(`Special token "${e}" is not in the special token encoder.`);yield[i],a=t+e.length,n=1}}return n}encodeNative(e,i){let a=0;const n=[];for(;;){const r=this.findNextSpecialToken(e,i,a),t=r?.[0],s=t??e.length,o=0===a&&s===e.length?e:e.slice(a,s);for(const[e]of o.matchAll(this.tokenSplitRegex)){const i=this.getBpeRankFromString(e);if(void 0!==i){n.push(i);continue}const a=this.bytePairEncode(e);n.push(...a)}if(void 0===t)break;{const e=r[1],i=this.specialTokensEncoder.get(e);if(void 0===i)throw new Error(`Special token "${e}" is not in the special token encoder.`);n.push(i),a=t+e.length}}return n}countNative(e,i){let a=0,n=0;for(;;){const r=this.findNextSpecialToken(e,i,a),t=r?.[0],s=t??e.length,o=0===a&&s===e.length?e:e.slice(a,s);for(const[e]of o.matchAll(this.tokenSplitRegex))void 0===this.getBpeRankFromString(e)?n+=this.bytePairEncode(e).length:n++;if(void 0===t)break;{const e=r[1];if(void 0===this.specialTokensEncoder.get(e))throw new Error(`Special token "${e}" is not in the special token encoder.`);n++,a=t+e.length}}return n}*decodeNativeGenerator(e){for(const i of e){const e=this.tryDecodeToken(i);e&&(yield e)}}decodeNative(e){let a="",n=s;for(const r of e){const e=this.tryDecodeToken(r);if(void 0===e)throw new Error(`Token ${r} is not in the byte pair encoder.`);if("string"==typeof e)n!==s&&(a+=i.decoder.decode(n,{stream:!0}),n=s),a+=e;else{const i=new Uint8Array(n.length+e.length);i.set(n),i.set(e,n.length),n=i}}return n!==s&&(a+=i.decoder.decode(n,{stream:!0})),a}async*decodeNativeAsyncIterable(e){for await(const i of e){const e=this.tryDecodeToken(i);e&&(yield e)}}getBpeRankFromString(e){return this.bytePairStringRankEncoder.get(e)}getBpeRankFromStringOrThrow(e){const i=this.getBpeRankFromString(e);if(void 0===i)throw new Error(`The byte-pair encoding does not contain a value for: ${e}`);return i}getBpeRankFromBytes(e){const i=(0,r.tryConvertToString)(e);if(void 0!==i)return this.getBpeRankFromString(i);const a=this.binarySearch(e);return-1!==a?this.bytePairNonUtfSortedEncoder[a][1]:void 0}getBpeRankFromBytesOrThrow(e){const i=this.getBpeRankFromBytes(e);if(void 0===i)throw new Error(`The byte-pair encoding does not contain a value for: ${e.toString()}`);return i}binarySearch(e){let i=0,a=this.bytePairNonUtfSortedEncoder.length-1;for(;i<=a;){const n=i+a>>>1,r=this.bytePairNonUtfSortedEncoder[n][0];let t=0;const s=Math.min(r.length,e.length);for(let i=0;i<s&&(t=r[i]-e[i],0===t);i++);if(0===t&&(t=r.length-e.length),0===t)return n;t<0?i=n+1:a=n-1}return-1}findNextSpecialToken(e,i,a){let n=a;for(;;){this.specialTokenPatternRegex.lastIndex=n;const a=this.specialTokenPatternRegex.exec(e);if(!a)return;const r=a[0];if(i?.has(r))return[a.index+n,r];n=a.index+n+1}}tryDecodeToken(e){const i=this.bytePairRankDecoder[e];if("string"==typeof i)return i;if("object"==typeof i){const i=this.bytePairNonUtfRankDecoder.get(e);if(i)return i}return this.specialTokensDecoder.get(e)}addToMergeCache(e,i){if(this.mergeCache){if(this.mergeCache.size>=this.mergeCacheSize){const e=this.mergeCache.keys().next().value;this.mergeCache.delete(e)}this.mergeCache.set(e,i)}}bytePairEncode(e){if(1===e.length&&(0,r.isAscii)(e.codePointAt(0)))return[this.getBpeRankFromStringOrThrow(e)];if(this.mergeCache?.has(e)){const i=this.mergeCache.get(e);return this.mergeCache.delete(e),this.mergeCache.set(e,i),i}const i=this.textEncoder.encode(e),a=this.bytePairMerge(i);return this.addToMergeCache(e,a),a}bytePairMerge(e){const i=[],a=[],n=(a,n=i[a],r=i[a+2])=>{if(void 0===r)return Number.POSITIVE_INFINITY;const t=e.subarray(n,r);return this.getBpeRankFromBytes(t)??Number.POSITIVE_INFINITY};for(let r=0;r<=e.length;r++)i.push(r),r<e.length-1?a.push(n(r,r,r+2)):a.push(Number.POSITIVE_INFINITY);for(;i.length>1;){let e=Number.POSITIVE_INFINITY,r=-1;for(let i=0;i<a.length-1;i++){const n=a[i];n<e&&(e=n,r=i)}if(e===Number.POSITIVE_INFINITY||-1===r)break;i.splice(r+1,1),a.splice(r,1),a[r]=n(r),r>0&&(a[r-1]=n(r-1))}const r=[];for(let a=0;a<i.length-1;a++){const n=i[a],t=i[a+1],s=this.getBpeRankFromBytesOrThrow(e.subarray(n,t));r.push(s)}return r}}},945:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.GptEncoding=void 0;const n=a(626),r=a(242),t=a(179),s=a(177),o=a(778),l=a(795),c=a(995),d=a(462);class u{static EndOfPrompt=l.EndOfPrompt;static EndOfText=l.EndOfText;static FimMiddle=l.FimMiddle;static FimPrefix=l.FimPrefix;static FimSuffix=l.FimSuffix;modelName;bytePairEncodingCoreProcessor;specialTokensEncoder;specialTokensSet;allSpecialTokenRegex;defaultSpecialTokenConfig;vocabularySize;constructor({bytePairRankDecoder:e,specialTokensEncoder:i,expectedVocabularySize:a,modelName:r,...t}){this.specialTokensEncoder=i,this.specialTokensSet=new Set(this.specialTokensEncoder.keys()),this.allSpecialTokenRegex=(0,d.getSpecialTokenRegex)(this.specialTokensSet),this.bytePairEncodingCoreProcessor=new n.BytePairEncodingCore({bytePairRankDecoder:e,specialTokensEncoder:i,...t}),this.defaultSpecialTokenConfig=this.processSpecialTokens();const s=Math.max(e.length-1,(0,d.getMaxValueFromMap)(i));if(this.vocabularySize=this.bytePairEncodingCoreProcessor.mergeableBytePairRankCount+i.size,void 0!==a){if(this.vocabularySize!==a)throw new Error("The number of mergeable tokens and special tokens must be equal to expectedVocabularySize.");if(s!==a-1)throw new Error(`The model encodings are invalid. The maximum token value must be equal to expectedVocabularySize - 1. Currently ${s}, expected ${a-1}`)}this.encode=this.encode.bind(this),this.decode=this.decode.bind(this),this.encodeGenerator=this.encodeGenerator.bind(this),this.decodeGenerator=this.decodeGenerator.bind(this),this.decodeAsyncGenerator=this.decodeAsyncGenerator.bind(this),this.decodeAsync=this.decodeAsync.bind(this),this.isWithinTokenLimit=this.isWithinTokenLimit.bind(this),this.encodeChat=this.encodeChat.bind(this),this.encodeChatGenerator=this.encodeChatGenerator.bind(this),this.countTokens=this.countTokens.bind(this),this.setMergeCacheSize=this.setMergeCacheSize.bind(this),this.clearMergeCache=this.clearMergeCache.bind(this),this.estimateCost=this.estimateCost.bind(this),this.modelName=r}static getEncodingApi(e,i){const a=(0,s.getEncodingParams)(e,i);return new u(a)}static getEncodingApiForModel(e,i){const a=t.modelToEncodingMap[e],n=(0,s.getEncodingParams)(a,i);return new u({...n,modelName:e})}processSpecialTokens({allowedSpecial:e,disallowedSpecial:i}={}){let a;if(e===r.ALL_SPECIAL_TOKENS||e?.has(r.ALL_SPECIAL_TOKENS)){const a=e=new Set(this.specialTokensSet);if(i===r.ALL_SPECIAL_TOKENS)throw new Error('allowedSpecial and disallowedSpecial cannot both be set to "all".');"object"==typeof i?i.forEach((e=>a.delete(e))):i=new Set}if(!i||i===r.ALL_SPECIAL_TOKENS||i.has(r.ALL_SPECIAL_TOKENS)){const n=i=new Set(this.specialTokensSet);e?.size?(e.forEach((e=>n.delete(e))),i.forEach((i=>e.delete(i))),i.size>0&&(a=(0,d.getSpecialTokenRegex)(i))):a=this.allSpecialTokenRegex}return{allowedSpecial:e,regexPattern:a}}encodeGenerator(e,i){const a=i?this.processSpecialTokens(i):this.defaultSpecialTokenConfig;if(a.regexPattern){const i=e.match(a.regexPattern);if(null!==i)throw new Error(`Disallowed special token found: ${i[0]}`)}return this.bytePairEncodingCoreProcessor.encodeNativeGenerator(e,a.allowedSpecial)}encode(e,i){const a=i?this.processSpecialTokens(i):this.defaultSpecialTokenConfig;if(a.regexPattern){const i=e.match(a.regexPattern);if(null!==i)throw new Error(`Disallowed special token found: ${i[0]}`)}return this.bytePairEncodingCoreProcessor.encodeNative(e,a.allowedSpecial)}*encodeChatGenerator(e,i=this.modelName){if(!i)throw new Error("Model name must be provided either during initialization or passed in to the method.");const a=t.chatModelParams[i],n=this.specialTokensEncoder.get(l.ImStart),r=this.specialTokensEncoder.get(l.ImEnd);if(!a||void 0===n||void 0===r)throw new Error(`Model '${i}' does not support chat.`);const s=new Set([l.ImSep]),{messageSeparator:o,roleSeparator:c}=a,d=o.length>0?this.encode(o):[],u=c.length>0?this.encode(c,{allowedSpecial:s}):[],p=new Map;for(const{role:i="system",name:a=i,content:t}of e){if(void 0===t)throw new Error("Content must be defined for all messages.");yield[n];const e=p.get(a)??this.encode(a);p.set(a,e),yield e,u.length>0&&(yield u),yield*this.encodeGenerator(t),yield[r],yield d}yield[n],yield*this.encodeGenerator("assistant"),u.length>0&&(yield u)}encodeChat(e,i=this.modelName){return[...this.encodeChatGenerator(e,i)].flat()}isWithinTokenLimit(e,i){const a="string"==typeof e?this.encodeGenerator(e):this.encodeChatGenerator(e);let n=0;for(const e of a)if(n+=e.length,n>i)return!1;return n}countTokens(e,i){if("string"==typeof e){const a=i?this.processSpecialTokens(i):this.defaultSpecialTokenConfig;if(a.regexPattern){const i=e.match(a.regexPattern);if(null!==i)throw new Error(`Disallowed special token found: ${i[0]}`)}return this.bytePairEncodingCoreProcessor.countNative(e,a.allowedSpecial)}const a=this.encodeChatGenerator(e);let n=0;for(const e of a)n+=e.length;return n}setMergeCacheSize(e){this.bytePairEncodingCoreProcessor.setMergeCacheSize(e)}clearMergeCache(){this.bytePairEncodingCoreProcessor.clearMergeCache()}decode(e){return this.bytePairEncodingCoreProcessor.decodeNative(e)}*decodeGenerator(e){const i=this.bytePairEncodingCoreProcessor.decodeNativeGenerator(e);let a="";for(const e of i)a+="string"==typeof e?e:n.decoder.decode(e,{stream:!0}),0===a.length||(0,c.endsWithIncompleteUtfPairSurrogate)(a)||(yield a,a="");a.length>0&&(yield a)}async*decodeAsyncGenerator(e){const i=this.bytePairEncodingCoreProcessor.decodeNativeAsyncIterable(e);let a="";for await(const e of i)a+="string"==typeof e?e:n.decoder.decode(e,{stream:!0}),0===a.length||(0,c.endsWithIncompleteUtfPairSurrogate)(a)||(yield a,a="");a.length>0&&(yield a)}async decodeAsync(e){const i=this.bytePairEncodingCoreProcessor.decodeNativeAsyncIterable(e);let a="";for await(const e of i)a+="string"==typeof e?e:n.decoder.decode(e,{stream:!0});return a}estimateCost(e,i=this.modelName){if(!i)throw new Error("Model name must be provided either during initialization or passed in to the method.");const a=o.models[i];if(!a)throw new Error(`Unknown model: ${i}`);if(!a.cost)throw new Error(`No cost information available for model: ${i}`);const n=a.cost,r={},t=e/1e6;return void 0!==n.input&&(r.input=n.input*t),void 0!==n.output&&(r.output=n.output*t),void 0!==n.batchInput&&(r.batchInput=n.batchInput*t),void 0!==n.batchOutput&&(r.batchOutput=n.batchOutput*t),r}}i.GptEncoding=u},242:(e,i)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.DEFAULT_MERGE_CACHE_SIZE=i.ALL_SPECIAL_TOKENS=void 0,i.ALL_SPECIAL_TOKENS="all",i.DEFAULT_MERGE_CACHE_SIZE=1e5},342:function(e,i,a){var n=this&&this.__createBinding||(Object.create?function(e,i,a,n){void 0===n&&(n=a);var r=Object.getOwnPropertyDescriptor(i,a);r&&!("get"in r?!i.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return i[a]}}),Object.defineProperty(e,n,r)}:function(e,i,a,n){void 0===n&&(n=a),e[n]=i[a]}),r=this&&this.__exportStar||function(e,i){for(var a in e)"default"===a||Object.prototype.hasOwnProperty.call(i,a)||n(i,e,a)};Object.defineProperty(i,"__esModule",{value:!0}),i.vocabularySize=i.setMergeCacheSize=i.isWithinTokenLimit=i.estimateCost=i.encodeGenerator=i.encode=i.decodeGenerator=i.decodeAsyncGenerator=i.decode=i.countTokens=i.clearMergeCache=void 0;const t=a(802),s=a(945);r(a(242),i),r(a(795),i);const o=s.GptEncoding.getEncodingApi("r50k_base",(()=>t.default)),{decode:l,decodeAsyncGenerator:c,decodeGenerator:d,encode:u,encodeGenerator:p,isWithinTokenLimit:m,countTokens:g,vocabularySize:h,setMergeCacheSize:y,clearMergeCache:b,estimateCost:f}=o;i.decode=l,i.decodeAsyncGenerator=c,i.decodeGenerator=d,i.encode=u,i.encodeGenerator=p,i.isWithinTokenLimit=m,i.countTokens=g,i.vocabularySize=h,i.setMergeCacheSize=y,i.clearMergeCache=b,i.estimateCost=f,i.default=o},120:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.Cl100KBase=function(e){const i=new Map([[n.EndOfText,100257],[n.FimPrefix,100258],[n.FimMiddle,100259],[n.FimSuffix,100260],[n.ImStart,100264],[n.ImEnd,100265],[n.ImSep,100266],[n.EndOfPrompt,100276]]);return{tokenSplitRegex:r.CL_AND_O_TOKEN_SPLIT_PATTERN,bytePairRankDecoder:e,specialTokensEncoder:i}};const n=a(795),r=a(417)},417:(e,i)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.CL_AND_O_TOKEN_SPLIT_PATTERN=i.R50K_TOKEN_SPLIT_REGEX=void 0,i.R50K_TOKEN_SPLIT_REGEX=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu,i.CL_AND_O_TOKEN_SPLIT_PATTERN=/(?:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+/giu},955:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.O200KBase=function(e){const i=new Map([[n.EndOfText,199999],[n.FimPrefix,2e5],[n.FimMiddle,200001],[n.FimSuffix,200002],[n.ImStart,200003],[n.ImEnd,200004],[n.ImSep,200005],[n.EndOfPrompt,200006]]);return{tokenSplitRegex:r.CL_AND_O_TOKEN_SPLIT_PATTERN,bytePairRankDecoder:e,specialTokensEncoder:i}};const n=a(795),r=a(417)},398:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.P50KBase=function(e){return{expectedVocabularySize:50281,tokenSplitRegex:r.R50K_TOKEN_SPLIT_REGEX,bytePairRankDecoder:e,specialTokensEncoder:new Map([[n.EndOfText,50256]])}},a(177);const n=a(795),r=a(417)},517:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.P50KEdit=function(e){const i=new Map([[n.EndOfText,50256],[n.FimPrefix,50281],[n.FimMiddle,50282],[n.FimSuffix,50283]]);return{tokenSplitRegex:r.R50K_TOKEN_SPLIT_REGEX,bytePairRankDecoder:e,specialTokensEncoder:i}},a(177);const n=a(795),r=a(417)},401:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.R50KBase=function(e){return{expectedVocabularySize:50257,tokenSplitRegex:r.R50K_TOKEN_SPLIT_REGEX,bytePairRankDecoder:e,specialTokensEncoder:new Map([[n.EndOfText,50256]])}},a(177);const n=a(795),r=a(417)},179:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.chatEnabledModelsList=i.chatModelParams=i.modelToEncodingMap=i.encodingNames=i.o200k_base=i.r50k_base=i.p50k_edit=i.p50k_base=i.cl100k_base=void 0;const n=a(778),r=a(795);i.cl100k_base="cl100k_base",i.p50k_base="p50k_base",i.p50k_edit="p50k_edit",i.r50k_base="r50k_base",i.o200k_base="o200k_base",i.encodingNames=[i.p50k_base,i.r50k_base,i.p50k_edit,i.cl100k_base,i.o200k_base];const t=Object.fromEntries(Object.entries(n.chatEnabledModels).map((([e,i])=>[e,i.encoding])));i.modelToEncodingMap=Object.fromEntries(Object.entries(n.models).map((([e,i])=>[e,i.encoding])));const s={messageSeparator:"\n",roleSeparator:"\n"},o={messageSeparator:"",roleSeparator:r.ImSep};i.chatModelParams=Object.fromEntries(Object.keys(t).flatMap((e=>e.startsWith("gpt-4")?[[e,o]]:e.startsWith("gpt-3.5-turbo")?[[e,s]]:[]))),i.chatEnabledModelsList=Object.keys(t)},177:(e,i,a)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.getEncodingParams=function(e,i){const a=i(e);switch(e.toLowerCase()){case"r50k_base":return(0,o.R50KBase)(a);case"p50k_base":return(0,t.P50KBase)(a);case"p50k_edit":return(0,s.P50KEdit)(a);case"cl100k_base":return(0,n.Cl100KBase)(a);case"o200k_base":return(0,r.O200KBase)(a);default:throw new Error(`Unknown encoding name: ${e}`)}};const n=a(120),r=a(955),t=a(398),s=a(517),o=a(401)},778:(e,i)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.models=i.chatEnabledModels=void 0;const a={humanName:"GPT-4o (Aug 2024)",description:"Our high-intelligence flagship model for complex, multi-step tasks. GPT-4o is cheaper and faster than GPT-4 Turbo. Currently points to gpt-4o-2024-08-06.",encoding:"o200k_base",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:2.5,output:10,batchInput:1.25,batchOutput:5,cachedInput:1.25}},n={humanName:"GPT-4o Mini",description:"Our affordable and intelligent small model for fast, lightweight tasks. GPT-4o mini is cheaper and more capable than GPT-3.5 Turbo. Currently points to gpt-4o-mini-2024-07-18.",encoding:"o200k_base",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:.15,output:.6,batchInput:.075,batchOutput:.3,cachedInput:.075}},r={humanName:"OpenAI o1",description:"Our most intelligent model, optimal for complex tasks requiring deep understanding and expertise. Currently points to o1-2024-12-17.",encoding:"o200k_base",context:128e3,maxOutput:32768,trainingData:"2023-10",cost:{input:15,output:60,batchInput:7.5,batchOutput:30,cachedInput:7.5}},t={humanName:"OpenAI o1-preview",description:"Preview version of the o1 model: o1-preview-2024-09-12.",encoding:"o200k_base",context:128e3,maxOutput:32768,trainingData:"2023-10",cost:{input:15,output:60,batchInput:7.5,batchOutput:30,cachedInput:7.5}},s={humanName:"OpenAI o1-mini",description:"Points to the most recent o1-mini snapshot: o1-mini-2024-09-12.",encoding:"o200k_base",context:128e3,maxOutput:65536,trainingData:"2023-10",cost:{input:1.1,output:4.4,batchInput:.55,batchOutput:2.2,cachedInput:.55}},o={humanName:"GPT-4o Mini Realtime Preview (Dec 2024)",encoding:"o200k_base",description:"Mini version for the Realtime API with December 2024 snapshot.",context:128e3,maxOutput:4096,trainingData:"2023-10",cost:{input:.6,output:2.4,cachedInput:.3}},l={humanName:"GPT-4o Mini Audio Preview (Dec 2024)",encoding:"o200k_base",description:"Mini version for the Audio API with December 2024 snapshot.",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:.15,output:.6}},c={humanName:"GPT-4o Mini Training",description:"Training GPT-4o Mini with custom datasets.",encoding:"o200k_base",cost:{input:3,output:0,batchInput:1.5,batchOutput:0}},d={humanName:"GPT-4 Turbo 2024-04-09",description:"The latest GPT-4 Turbo model with vision capabilities. Vision requests can now use JSON mode and function calling. Currently points to gpt-4-turbo-2024-04-09.",encoding:"cl100k_base",context:128e3,maxOutput:4096,trainingData:"2023-12",cost:{input:10,output:30,batchInput:5,batchOutput:15}},u={humanName:"GPT-4",description:"Currently points to gpt-4-0613. See continuous model upgrades.",encoding:"cl100k_base",context:8192,maxOutput:8192,trainingData:"2021-09",cost:{input:30,output:60,batchInput:15,batchOutput:30}},p={humanName:"GPT-4 0125 Preview",description:"GPT-4 Turbo preview model intended to reduce cases of “laziness” where the model doesn’t complete a task.",encoding:"cl100k_base",context:128e3,maxOutput:4096,trainingData:"2023-12",cost:{input:10,output:30,batchInput:5,batchOutput:15}},m={...p,humanName:"GPT-4 1106 Preview"},g={humanName:"GPT-3.5 Turbo 0125",description:"The latest GPT-3.5 Turbo model with higher accuracy at responding in requested formats and a fix for a bug which caused a text encoding issue for non-English language function calls.",encoding:"cl100k_base",context:16385,maxOutput:4096,trainingData:"2021-09",cost:{input:.5,output:1.5,batchInput:.25,batchOutput:.75}},h={humanName:"GPT-3.5 Turbo Instruct",description:"Similar capabilities as GPT-3 era models. Compatible with legacy Completions endpoint and not Chat Completions.",encoding:"cl100k_base",context:4096,maxOutput:4096,trainingData:"2021-09",cost:{input:1.5,output:2}},y={humanName:"GPT-4 32k",encoding:"cl100k_base",description:"Snapshot of gpt-4 from June 13th 2023 with improved function calling support.",shutdownDate:"2025-06-06",recommendedReplacement:"gpt-4o",context:32768,maxOutput:16384,trainingData:"2021-09",cost:{input:60,output:120,batchInput:30,batchOutput:60}},b={humanName:"GPT-4 Vision Preview",encoding:"cl100k_base",description:"Vision capabilities preview of GPT-4.",shutdownDate:"2024-12-06",recommendedReplacement:"gpt-4o",context:128e3,maxOutput:4096,trainingData:"2023-12",cost:{input:10,output:30,batchInput:5,batchOutput:15}},f=b,v={humanName:"Code Davinci 001",encoding:"p50k_base",description:"Older coding model.",shutdownDate:"2023-03-23",recommendedReplacement:"gpt-4o"},k={humanName:"Code Cushman 001",encoding:"p50k_base",description:"Older model for coding tasks.",shutdownDate:"2023-03-23",recommendedReplacement:"gpt-4o"},w={...y,humanName:"GPT-4 32k 0314"};i.chatEnabledModels={o1:r,"o1-2024-12-17":r,"o1-preview":t,"o1-preview-2024-09-12":t,"o1-mini":s,"o1-mini-2024-09-12":s,"o3-mini":{humanName:"OpenAI o3-mini",description:"Small cost-efficient reasoning model that's optimized for coding, math, and science, and supports tools and Structured Outputs.",encoding:"o200k_base",context:2e5,maxOutput:65536,trainingData:"2023-10",cost:{input:1.1,output:4.4,batchInput:.55,batchOutput:2.2,cachedInput:.55}},"chatgpt-4o-latest":{humanName:"ChatGPT 4o Latest",description:"The chatgpt-4o-latest model version continuously points to the version of GPT-4o used in ChatGPT, and is updated frequently when there are significant changes.",encoding:"o200k_base",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:5,output:15}},"gpt-4o":a,"gpt-4o-2024-11-20":{humanName:"GPT-4o (Nov 2024)",description:"November 2024 snapshot of the GPT-4o model with enhanced capabilities.",encoding:"o200k_base",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:2.5,output:10,batchInput:1.25,batchOutput:5,cachedInput:1.25}},"gpt-4o-2024-08-06":a,"gpt-4o-2024-05-13":{humanName:"GPT-4o",description:"Original gpt-4o snapshot from May 13, 2024, offering advanced multimodal capabilities.",encoding:"o200k_base",context:128e3,maxOutput:4096,trainingData:"2023-10",cost:{input:5,output:15,batchInput:2.5,batchOutput:7.5}},"gpt-4o-mini":n,"gpt-4o-mini-2024-07-18":n,"gpt-4o-realtime-preview":{humanName:"GPT-4o Realtime Preview",encoding:"o200k_base",description:"Preview release for the Realtime API.",context:128e3,maxOutput:4096,trainingData:"2023-10",cost:{input:5,output:20,cachedInput:2.5}},"gpt-4o-realtime-preview-2024-10-01":{humanName:"GPT-4o Realtime Preview (Oct 2024)",encoding:"o200k_base",description:"Current snapshot for the Realtime API model.",context:128e3,maxOutput:4096,trainingData:"2023-10",cost:{input:5,output:20,cachedInput:2.5}},"gpt-4o-realtime-preview-2024-12-17":{humanName:"GPT-4o Realtime Preview (Dec 2024)",encoding:"o200k_base",description:"December 2024 snapshot for the Realtime API model.",context:128e3,maxOutput:4096,trainingData:"2023-10",cost:{input:5,output:20,cachedInput:2.5}},"gpt-4o-mini-realtime-preview":o,"gpt-4o-mini-realtime-preview-2024-12-17":o,"gpt-4o-audio-preview":{humanName:"GPT-4o Audio Preview",encoding:"o200k_base",description:"Preview release for audio inputs in chat completions.",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:2.5,output:10}},"gpt-4o-audio-preview-2024-10-01":{humanName:"GPT-4o Audio Preview (Oct 2024)",encoding:"o200k_base",description:"Current snapshot for the Audio API model.",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:2.5,output:10}},"gpt-4o-audio-preview-2024-12-17":{humanName:"GPT-4o Audio Preview (Dec 2024)",encoding:"o200k_base",description:"December 2024 snapshot for the Audio API model.",context:128e3,maxOutput:16384,trainingData:"2023-10",cost:{input:2.5,output:10}},"gpt-4o-mini-audio-preview":l,"gpt-4o-mini-audio-preview-2024-12-17":l,"gpt-4o-2024-08-06-finetune":{humanName:"GPT-4o 2024-08-06 Finetuning",description:"GPT-4o finetuned for custom tasks.",encoding:"o200k_base",cost:{input:3.75,output:15,batchInput:1.875,batchOutput:7.5,cachedInput:1.875,training:25}},"gpt-4o-mini-2024-07-18-finetune":{humanName:"GPT-4o Mini 2024-07-18 Finetuning",description:"GPT-4o mini finetuned for custom tasks.",encoding:"o200k_base",cost:{input:.3,output:1.2,batchInput:.15,batchOutput:.6,cachedInput:.15,training:3}},"gpt-4o-mini-training":c,"gpt-4o-mini-training-2024-07-18":c,"davinci-002-finetune":{humanName:"Davinci-002 Finetuning",description:"Davinci-002 finetuned for custom tasks.",encoding:"p50k_base",cost:{input:12,output:12,batchInput:6,batchOutput:6,training:6}},"babbage-002-finetune":{humanName:"Babbage-002 Finetuning",description:"Babbage-002 finetuned for custom tasks.",encoding:"p50k_base",cost:{input:1.6,output:1.6,batchInput:.8,batchOutput:.8,training:.4}},"gpt-4-turbo":d,"gpt-4-turbo-2024-04-09":d,"gpt-4-turbo-preview":p,"gpt-4-0125-preview":p,"gpt-4-1106-preview":m,"gpt-4":u,"gpt-4-0613":u,"gpt-3.5-turbo":g,"gpt-3.5-turbo-0125":g,"gpt-3.5-turbo-1106":{humanName:"GPT-3.5 Turbo 1106",description:"GPT-3.5 Turbo model with improved instruction following, JSON mode, reproducible outputs, parallel function calling, and more.",encoding:"cl100k_base",context:16385,maxOutput:4096,trainingData:"2021-09",cost:{input:1,output:2,batchInput:.5,batchOutput:1}},"gpt-3.5-turbo-finetune":{humanName:"GPT-3.5 Turbo Finetuning",description:"Finetuning GPT-3.5 Turbo with custom data.",encoding:"cl100k_base",cost:{input:3,output:6,batchInput:1.5,batchOutput:3,training:8}},"gpt-3.5-turbo-16k":{humanName:"GPT-3.5 Turbo 16k",description:"GPT-3.5 model with 16k token context.",encoding:"cl100k_base",cost:{input:3,output:4,batchInput:1.5,batchOutput:2}},"gpt-4-32k":y,"gpt-4-32k-0613":y,"gpt-4-vision-preview":b,"gpt-4-1106-vision-preview":f,"gpt-4-0314":{humanName:"GPT-4 0314",encoding:"cl100k_base",description:"Variant of GPT-4 model.",shutdownDate:"2024-06-13",recommendedReplacement:"gpt-4o",context:8192,maxOutput:8192,trainingData:"2021-09",cost:{input:30,output:60}},"gpt-4-32k-0314":w,"gpt-3.5-turbo-0613":{humanName:"GPT-3.5 Turbo 0613",encoding:"cl100k_base",description:"Version of GPT-3.5 Turbo from June 2013.",shutdownDate:"2024-09-13",recommendedReplacement:"gpt-3.5-turbo",context:16385,maxOutput:4096,trainingData:"2021-09",cost:{input:1.5,output:2,batchInput:.75,batchOutput:1}},"gpt-3.5-turbo-16k-0613":{humanName:"GPT-3.5 Turbo 16k 0613",encoding:"cl100k_base",description:"16k context version from June 2013.",shutdownDate:"2024-09-13",recommendedReplacement:"gpt-3.5-turbo",context:16385,maxOutput:4096,trainingData:"2021-09",cost:{input:3,output:4,batchInput:1.5,batchOutput:2}},"gpt-3.5-turbo-0301":{humanName:"GPT-3.5 Turbo 0301",encoding:"cl100k_base",description:"Earlier version of GPT-3.5 Turbo.",shutdownDate:"2024-09-13",recommendedReplacement:"gpt-3.5-turbo",context:16385,maxOutput:4096,trainingData:"2021-09",cost:{input:1.5,output:2,batchInput:.75,batchOutput:1}}},i.models={...i.chatEnabledModels,"text-embedding-3-small":{humanName:"Text Embedding 3 Small",description:"Embedding model for small-scale applications.",encoding:"cl100k_base",maxInput:8191,cost:{input:.02,batchInput:.01}},"text-embedding-3-large":{humanName:"Text Embedding 3 Large",description:"Embedding model for large-scale applications.",encoding:"cl100k_base",maxInput:8191,cost:{input:.13,batchInput:.065}},"text-embedding-ada-002":{humanName:"Ada v2",description:"A versatile model suitable for text embeddings and lightweight NLP tasks.",encoding:"cl100k_base",maxInput:8191,cost:{input:.1,output:0,batchInput:.05,batchOutput:0}},"gpt-3.5-turbo-instruct":h,"gpt-3.5-turbo-instruct-0914":h,"davinci-002":{humanName:"Davinci 002",description:"Replacement for the GPT-3 curie and davinci base models.",encoding:"p50k_base",context:16384,maxOutput:16384,trainingData:"2021-09",cost:{input:2,output:2,batchInput:1,batchOutput:1}},"babbage-002":{humanName:"Babbage 002",description:"Replacement for the GPT-3 ada and babbage base models.",encoding:"p50k_base",context:16384,trainingData:"2021-09",cost:{input:.4,output:.4,batchInput:.2,batchOutput:.2}},"text-ada-001":{humanName:"Text Ada 001",encoding:"r50k_base",description:"Model for lightweight tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"gpt-3.5-turbo-instruct",cost:{input:.4}},"text-babbage-001":{humanName:"Text Babbage 001",encoding:"r50k_base",description:"Model for efficient processing.",shutdownDate:"2024-01-04",recommendedReplacement:"gpt-3.5-turbo-instruct",cost:{input:.5}},"text-curie-001":{humanName:"Text Curie 001",encoding:"r50k_base",description:"Mid-range model for various tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"gpt-3.5-turbo-instruct",cost:{input:2}},"text-davinci-001":{humanName:"Text Davinci 001",encoding:"r50k_base",description:"High-performance model for complex tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"gpt-3.5-turbo-instruct",cost:{input:20}},"text-davinci-002":{humanName:"Text Davinci 002",encoding:"p50k_base",description:"Legacy high-performance model.",shutdownDate:"2024-01-04",recommendedReplacement:"gpt-3.5-turbo-instruct",cost:{input:20}},"text-davinci-003":{humanName:"Text Davinci 003",encoding:"p50k_base",description:"Latest of the Davinci series.",shutdownDate:"2024-01-04",recommendedReplacement:"gpt-3.5-turbo-instruct",cost:{input:20}},ada:{humanName:"Ada",encoding:"r50k_base",description:"Base model for lightweight tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"babbage-002",cost:{input:.4}},babbage:{humanName:"Babbage",encoding:"r50k_base",description:"Model for efficient processing.",shutdownDate:"2024-01-04",recommendedReplacement:"babbage-002",cost:{input:.5}},curie:{humanName:"Curie",encoding:"r50k_base",description:"Mid-range model for a variety of applications.",shutdownDate:"2024-01-04",recommendedReplacement:"davinci-002",cost:{input:2}},davinci:{humanName:"Davinci",encoding:"p50k_base",description:"High-performance legacy model.",shutdownDate:"2024-01-04",recommendedReplacement:"davinci-002",cost:{input:20}},"code-davinci-002":{humanName:"Code Davinci 002",encoding:"p50k_base",description:"Legacy coding model.",shutdownDate:"2023-03-23",recommendedReplacement:"gpt-4o"},"code-davinci-001":v,"davinci-codex":v,"code-davinci-edit-001":{humanName:"Code Davinci 001",encoding:"p50k_edit",description:"Older coding model.",shutdownDate:"2023-03-23"},"code-cushman-002":{humanName:"Code Cushman 002",encoding:"p50k_base",description:"Legacy model for coding.",shutdownDate:"2023-03-23",recommendedReplacement:"gpt-4o"},"code-cushman-001":k,"cushman-codex":k,"code-search-ada-code-001":{humanName:"Code Search Ada Code 001",encoding:"r50k_base",description:"Embedding model for code search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:4}},"code-search-ada-text-001":{humanName:"Code Search Ada Text 001",encoding:"r50k_base",description:"Embedding model for text search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:4}},"text-davinci-edit-001":{humanName:"Text Davinci 001",encoding:"p50k_edit",description:"Older text model.",shutdownDate:"2023-03-23"},"text-similarity-ada-001":{humanName:"Text Similarity Ada 001",encoding:"r50k_base",description:"Embedding model for similarity tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:4}},"text-search-ada-doc-001":{humanName:"Text Search Ada Doc 001",encoding:"r50k_base",description:"Embedding model for document search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:4}},"text-search-ada-query-001":{humanName:"Text Search Ada Query 001",encoding:"r50k_base",description:"Embedding model for query search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:4}},"text-similarity-babbage-001":{humanName:"Text Similarity Babbage 001",encoding:"r50k_base",description:"Embedding model for similarity tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:5}},"text-search-babbage-doc-001":{humanName:"Text Search Babbage Doc 001",encoding:"r50k_base",description:"Embedding model for document search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:5}},"text-search-babbage-query-001":{humanName:"Text Search Babbage Query 001",encoding:"r50k_base",description:"Embedding model for query search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:5}},"code-search-babbage-code-001":{humanName:"Code Search Babbage Code 001",encoding:"r50k_base",description:"Embedding model for code search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:5}},"code-search-babbage-text-001":{humanName:"Code Search Babbage Text 001",encoding:"r50k_base",description:"Embedding model for text search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:5}},"text-similarity-curie-001":{humanName:"Text Similarity Curie 001",encoding:"r50k_base",description:"Embedding model for similarity tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:20}},"text-search-curie-doc-001":{humanName:"Text Search Curie Doc 001",encoding:"r50k_base",description:"Embedding model for document search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:20}},"text-search-curie-query-001":{humanName:"Text Search Curie Query 001",encoding:"r50k_base",description:"Embedding model for query search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:20}},"text-similarity-davinci-001":{humanName:"Text Similarity Davinci 001",encoding:"r50k_base",description:"Embedding model for similarity tasks.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:200}},"text-search-davinci-doc-001":{humanName:"Text Search Davinci Doc 001",encoding:"r50k_base",description:"Embedding model for document search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:200}},"text-search-davinci-query-001":{humanName:"Text Search Davinci Query 001",encoding:"r50k_base",description:"Embedding model for query search.",shutdownDate:"2024-01-04",recommendedReplacement:"text-embedding-3-small",cost:{input:200}}}},795:(e,i)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.EndOfPrompt=i.ImSep=i.ImEnd=i.ImStart=i.FimSuffix=i.FimMiddle=i.FimPrefix=i.EndOfText=void 0,i.EndOfText="<|endoftext|>",i.FimPrefix="<|fim_prefix|>",i.FimMiddle="<|fim_middle|>",i.FimSuffix="<|fim_suffix|>",i.ImStart="<|im_start|>",i.ImEnd="<|im_end|>",i.ImSep="<|im_sep|>",i.EndOfPrompt="<|endofprompt|>"},995:(e,i)=>{Object.defineProperty(i,"__esModule",{value:!0}),i.isAscii=void 0,i.endsWithIncompleteUtfPairSurrogate=function(e){if(0===e.length)return!1;const i=e.charCodeAt(e.length-1);return i>=a&&i<=n},i.tryConvertToString=function(e){if(function(e){let i=0;for(;i<e.length;){const a=e[i];let n=0,r=0;if(a<=127)n=1,r=a;else if(192==(224&a)){if(n=2,r=31&a,a<=193)return!1}else if(224==(240&a))n=3,r=15&a;else{if(240!=(248&a))return!1;if(n=4,r=7&a,a>244)return!1}if(i+n>e.length)return!1;for(let a=1;a<n;a++){const n=e[i+a];if(void 0===n||128!=(192&n))return!1;r=r<<6|63&n}if(2===n&&r<128)return!1;if(3===n&&r<2048)return!1;if(4===n&&r<65536)return!1;if(r>=55296&&r<=57343)return!1;if(r>1114111)return!1;i+=n}return!0}(e))return r.decode(e)},i.compareUint8Arrays=function(e,i){const a=Math.min(e.length,i.length);for(let n=0;n<a;n++)if(e[n]!==i[n])return e[n]-i[n];return e.length-i.length},i.isAscii=e=>e<=127;const a=55296,n=56319,r=new TextDecoder("utf8",{fatal:!1})},462:(e,i)=>{function a(e){return e.replace(/[$()*+.?[\\\]^{|}]/g,"\\$&")}Object.defineProperty(i,"__esModule",{value:!0}),i.getMaxValueFromMap=function(e){let i=0;return e.forEach((e=>{i=Math.max(i,e)})),i},i.escapeRegExp=a,i.getSpecialTokenRegex=function(e){const i=[...e].map(a).join("|");return new RegExp(`(${i})`)}},802:(e,i,a)=>{a.r(i),a.d(i,{default:()=>t});const n=["!",'"',"#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~",[161],[162],[163],[164],[165],[166],[167],[168],[169],[170],[171],[172],[174],[175],[176],[177],[178],[179],[180],[181],[182],[183],[184],[185],[186],[187],[188],[189],[190],[191],[192],[193],[194],[195],[196],[197],[198],[199],[200],[201],[202],[203],[204],[205],[206],[207],[208],[209],[210],[211],[212],[213],[214],[215],[216],[217],[218],[219],[220],[221],[222],[223],[224],[225],[226],[227],[228],[229],[230],[231],[232],[233],[234],[235],[236],[237],[238],[239],[240],[241],[242],[243],[244],[245],[246],[247],[248],[249],[250],[251],[252],[253],[254],[255],"\0","","","","","","","","\b","\t","\n","\v","\f","\r","","","","","","","","","","","","","","","","","",""," ","",[128],[129],[130],[131],[132],[133],[134],[135],[136],[137],[138],[139],[140],[141],[142],[143],[144],[145],[146],[147],[148],[149],[150],[151],[152],[153],[154],[155],[156],[157],[158],[159],[160],[173]," t"," a","he","in","re","on"," the","er"," s","at"," w"," o","en"," c","it","is","an","or","es"," b","ed"," f","ing"," p","ou"," an","al","ar"," to"," m"," of"," in"," d"," h"," and","ic","as","le"," th","ion","om","ll","ent"," n"," l","st"," re","ve"," e","ro","ly"," be"," g"," T","ct"," S","id","ot"," I","ut","et"," A"," is"," on","im","am","ow","ay","ad","se"," that"," C","ig"," for","ac"," y","ver","ur"," u","ld"," st"," M","'s"," he"," it","ation","ith","ir","ce"," you","il"," B"," wh","ol"," P"," with"," 1","ter","ch"," as"," we"," (","nd","ill"," D","if"," 2","ag","ers","ke",' "'," H","em"," con"," W"," R","her"," was"," r","od"," F","ul","ate"," at","ri","pp","ore"," The"," se","us"," pro"," ha","um"," are"," de","ain","and"," or","igh","est","ist","ab","rom"," N","th"," com"," G","un","op","00"," L"," not","ess"," ex"," v","res"," E","ew","ity","ant"," by","el","os","ort","oc","qu"," from"," have"," su","ive","ould"," sh"," this","nt","ra","pe","ight","art","ment"," al","ust","end","--","all"," O","ack"," ch"," le","ies","red","ard",[226,128],"out"," J"," ab","ear","iv","ally","our","ost","gh","pt"," pl","ast"," can","ak","ome","ud","The"," his"," do"," go"," has","ge","'t"," U","rou"," sa"," j"," but"," wor"," all","ect"," k","ame"," will","ok"," whe"," they","ide","01","ff","ich","pl","ther"," tr",".."," int","ie","ure","age"," ne","ial","ap","ine","ice"," me"," out","ans","one","ong","ions"," who"," K"," up"," their"," ad"," 3"," us","ated","ous"," more","ue","og"," St","ind","ike"," so","ime","per",'."',"ber","iz","act"," one"," said"," -","are"," your","cc"," Th"," cl","ep","ake","able","ip"," cont"," which","ia"," im"," about"," were","very","ub"," had"," en"," comp",',"'," In"," un"," ag","ire","ace","au","ary"," would","ass","ry",[32,226,128],"cl","ook","ere","so"," V","ign","ib"," off"," te","ven"," Y","ile","ose","ite","orm"," 201"," res"," man"," per"," other","ord","ult"," been"," like","ase","ance","ks","ays","own","ence"," dis","ction"," any"," app"," sp","int","ress","ations","ail"," 4","ical"," them"," her","ount"," Ch"," ar"," if"," there"," pe"," year","av"," my"," some"," when","ough","ach"," than","ru","ond","ick"," over","vel"," qu","\n\n"," sc","reat","ree"," It","ound","port"," also"," part","fter"," kn"," bec"," time","ens"," 5","ople"," what"," no","du","mer","ang"," new","----"," get","ory","ition","ings"," just"," into"," 0","ents","ove","te"," people"," pre"," its"," rec"," tw","ian","irst","ark","ors"," work","ade","ob"," she"," our","wn","ink","lic"," 19"," He","ish","nder","ause"," him","ons"," ["," ro","form","ild","ates","vers"," only","oll"," spe","ck","ell","amp"," acc"," bl","ious","urn","ft","ood"," how","hed"," '"," after","aw"," att","ov","ne"," play","erv","ict"," could","itt"," am"," first"," 6"," act"," $","ec","hing","ual","ull"," comm","oy","old","ces","ater"," fe"," bet","we","iff"," two","ock"," back",").","ident"," under","rough","sel","xt"," may","round"," po","ph","iss"," des"," most"," did"," add","ject"," inc","fore"," pol","ont"," again","clud","tern"," know"," need"," cons"," co"," ."," want"," see"," 7","ning","iew"," This","ced"," even"," ind","ty"," We","ath"," these"," pr"," use"," because"," fl","ng"," now"," –","com","ise"," make"," then","ower"," every"," Un"," sec","oss","uch"," em"," ="," Re","ied","rit"," inv","lect"," supp","ating"," look","man","pect"," 8","row"," bu"," where","ific"," years","ily"," diff"," should"," rem","Th","In"," ev","day","'re","rib"," rel","ss"," def"," right"," sy","),","les","000","hen"," through"," Tr","__"," way"," don"," ,"," 10","ased"," ass","ublic"," reg"," And","ix"," very"," includ","other"," imp","oth"," sub"," —"," being","arg"," Wh","==","ible"," does","ange","ram"," 9","ert","ps","ited","ational"," br"," down"," many","aking"," call","uring","ities"," ph","ics","als"," dec","ative","ener"," before","ility"," well"," much","erson"," those"," such"," ke"," end"," But","ason","ting"," long","ef"," think","ys"," bel"," sm","its","ax"," own"," prov"," set","ife","ments","ble","ward"," show"," pres","ms","omet"," ob"," say"," Sh","ts","ful"," eff"," gu"," inst","und","ren","cess"," ent"," You"," good"," start","ince"," made","tt","stem","olog","up"," |","ump"," hel","vern","ular","ually"," ac"," mon"," last"," 200","10"," stud","ures"," Ar","self","ars","meric","ues","cy"," min","ollow"," col","io"," mod"," count"," Com","hes"," fin","air","ier","—","read","ank","atch","ever"," str"," point","ork"," New"," sur","ool","alk","ement"," used","ract","ween"," same","oun"," Al","ci"," differe"," while","--------"," game","cept"," sim","..."," inter","ek"," report"," produ"," still","led","ah"," here"," world"," though"," num","arch","imes","ale"," Se"," If","//"," Le"," ret"," ref"," trans","ner","ution","ters"," take"," Cl"," conf","way","ave"," going"," sl","ug"," Americ"," spec"," hand"," between","ists"," De","oot","It"," ear"," against"," high","gan","az","ather"," exp"," op"," ins"," gr"," help"," requ","ets","ins"," Pro","ism"," found","land","ata","uss","ames"," person"," great","pr"," sign"," An","'ve"," somet"," ser","hip"," run"," :"," ter","irect"," follow"," det","ices"," find","12"," mem"," cr","ered","ex"," ext","uth","ense","co"," team","ving","ouse","ash","att","ved"," system"," As","der","ives","min"," lead"," Bl","cent"," around"," govern"," cur","velop","any"," cour","alth","ages","ize"," car","ode"," law"," read","'m","con"," real"," support"," 12","...."," really","ness"," fact"," day"," both","ying"," serv"," For"," three"," wom"," med","ody"," They","50"," exper","ton"," each","akes"," che"," cre","ines"," rep","19","gg","illion"," grou","ute","ik","We","get","ER"," met"," says","ox"," during","ern","ized","ared"," fam","ically"," happ"," Is"," char","med","vent"," gener","ient","ple","iet","rent","11","ves","ption"," 20","formation"," cor"," offic","ield"," too","ision"," inf"," Z","the","oad"," public"," prog","ric","**"," war"," power","view"," few"," loc"," different"," state"," head","'ll"," poss"," stat","ret","ants"," val"," iss"," cle","ivers","anc"," expl"," another"," Q"," av","thing","nce","Wh"," child"," since","ired","less"," life"," develop","ittle"," dep"," pass",[227,131]," turn","orn","This","bers","ross"," Ad"," fr"," resp"," second","oh"," /"," disc"," &"," something"," comple"," ed"," fil"," month","aj","uc"," government"," without"," leg"," dist"," put"," quest","ann"," prot","20"," never","ience"," level"," art"," things"," might"," effect"," contro"," cent"," 18"," allow"," belie","chool","ott"," incre"," feel"," result"," lot"," fun","ote"," ty","erest"," contin"," using"," big","201"," ask"," best"," )","IN"," opp","30"," number","iness","St","lease"," ca"," must"," direct"," gl"," <"," open"," post"," come"," seem","ording"," week","ately","ital"," el","riend"," far"," tra","inal"," pri"," US"," place"," form"," told",'":',"ains","ature"," Trump"," stand"," #","ider"," Fr"," next"," soc"," pur"," let"," little"," hum"," i","ron","15"," 15"," commun"," mark"," There"," wr"," That"," information","ways"," bus","app"," invest","me"," hard","ained","ead"," import"," appro"," test"," tri"," rest","osed"," full"," care"," Sp"," case","ON"," sk"," less"," +"," partic"," Pl","ably","uck","ished","chn","be"," list","ator"," top"," adv"," Be","ruct"," dem","ration","ling","gy","reen","ger"," home"," left"," better"," data"," 11"," attack"," proble","line","ards"," beh","ral"," How"," She","arge"," --","://"," bro"," Ph","ats"," build","ww","ided","aim","ases","ency"," main","ined"," including"," {"," got"," interest"," keep"," X"," eas","aining"," class","…"," No"," var"," small","ample","AT"," ide"," So"," rece"," polit"," mov"," plan"," percent","iving"," camp"," pay","14","sc","ised"," unt","oney","ploy","===="," didn"," Ind","els","ertain"," pos","____","iver"," process"," program","ified"," Rep","16","uro","ology","atter","ina"," name"," All"," four"," return","vious","bs"," called"," move"," Sc","ird"," group"," bre"," men"," cap","ten","ee"," dri","leg","here","uthor"," pat"," current","ides"," pop","to","ention"," always"," mil"," women"," 16"," old","iven","raph"," Or","ror","ently"," near"," Ex","ream","sh"," 14"," free","ission","stand"," Con","ality","used","13"," design"," change"," chang"," bo"," vis","ember"," book","ready"," kill","25","pped"," away"," able"," country"," const","arn"," order","AR","ior","ium","orth","18","ailable"," sw"," million"," 13","atic","ted"," Go"," oper","eng"," thing","ajor","conom"," Comm"," why","ured","ural"," school","by"," Mar"," aff"," days"," ann","ush","ane","If","eg"," prof"," health","outh","But","ional",".,"," sol"," already"," 30"," charact","He"," friend","ES","ians","icle","'d"," On"," least"," prom"," dr"," hist","ither"," est","iqu","17","son"," tell"," talk","ohn","oint","lection","AN"," until","augh"," later"," ve"," view","ending","ived"," word","ware"," cost"," enough"," give"," United"," techn","arent","OR"," par"," Dr"," 2016","rist","ering",[32,194]," large","side","acy","ccess"," win"," important"," 199"," doesn"," 17"," business"," clear"," rese",'",',"ury"," equ","aster","alf"," American","nect"," expect","iversity"," occ"," Fl"," kind"," mean"," past"," dev"," bas","let","raft"," organ"," del"," perform"," story"," season"," Col"," claim"," came"," within"," line"," project"," At"," control","ended"," Sy"," air","ization"," *","ley"," money","idd","You","for"," family"," making"," bit"," police"," happen"," vers","ony","uff"," When"," sit","ideo","lf","ison"," sure","gin"," appear"," light"," es","of"," water"," times","not"," grow"," company"," Te","ows"," mar","ource","iol","arm","br"," example"," conc"," fore"," To","pro","EN","ries"," 25"," Can","ney"," actually"," ever","urity","aken","aps"," tax"," major","ama"," often","eral"," human"," job","ister"," available","ocr","enn","aid","ivid"," record",'?"'," sing"," Am","idence"," news","ster"," econom"," following"," Br","ising"," hour","most","ument"," sex"," desc"," become"," Ed"," took"," having"," product","ault","As","aring"," means"," hop","une"," cho"," certain"," non"," deal","24","lement","oci","ene"," side"," Pr"," May"," reason","ued","ched","ulation"," elect"," official"," possible"," hold","ands","ots"," city","ories"," sever"," children"," once"," activ","ler"," night","itions"," John","ape","play"," done"," lim"," working"," Pres","orld","eb"," Co"," body","ails","utes"," Mr"," whether"," author","rop"," proper"," seen",");"," fac"," Su"," cond","iting"," course"," }","----------------","aign"," event"," eng"," pot"," intern","iam"," short","empt",[227,130]," God","ilar","80"," orig","IS","ourn","ability","itive"," dam"," 100"," press"," doing"," protect","ring"," thought"," question","rew"," War"," several"," State"," given"," fund"," Tw"," went","ances","work","por","my","40"," arg","artment","ustom"," polic"," meet"," creat","22"," States"," games","raw","uture"," understand","urs"," Ob","lish","sy"," makes"," won","agon"," htt"," love","ential"," complete","par"," Im","AL"," account"," ","ored","vert"," ident"," 2015"," others"," Min","iber","verage","There","itional","dd"," prob"," young"," a